SQL 读取 Table 日期之间,如果不存在仍然写为空

SQL Read Table Between dates, if nothing exists still write as empty

我正在阅读三个不同的 tables,效果很好。

SELECT id AS Projekt_ID, cu.name AS Projektname, effort AS Ist FROM cost_unit cu 
                    LEFT OUTER JOIN (SELECT p.cost_unit_id, SUM(te.effort) AS effort, p.id AS id
                    FROM time_entry te, project p, activity a
                    WHERE te.task = a.uuid AND a.costunit = p.cost_unit_id AND te.date BETWEEN
                    'firstTime'
                    AND
                    'secondTime'
                    GROUP BY p.cost_unit_id, p.id)te ON cu.uuid = te.cost_unit_id
                    WHERE id = " + ar[0]

如您所见,我使用变量处理日期和项目 ID,但如前所述,一切正常。

问题是,我只从 table 获取恰好在这些日期之间的数据。 但我需要一切,如果在那个日期之间 table 中没有时间条目,我需要它们为空,或者最好说为 0,00。

我可以改变什么来使这项工作正常进行?它是 PostreSQL,仅供参考

如果我没有正确理解你的问题,我会使用 table 个日期来完成此操作。

如果我有一个包含所有相关日期的 table 可能是这样的:

Date
01/01/2015
02/01/2015
...
31/12/2017

然后你可以像这样修改你的查询(可能有问题,但我希望你能理解):

Select 
    d.Date
    ,Projekt_ID
    ,Projektname
    ,Ist
FROM
    DatesTable as d
    LEFT OUTER JOIN (
            SELECT 
                id AS Projekt_ID
                , cu.name AS Projektname
                , effort AS Ist 
                ,te.date
            FROM 
                cost_unit cu 
                LEFT OUTER JOIN (
                            SELECT 
                                p.cost_unit_id
                                , SUM(te.effort) AS effort
                                , p.id AS id
                                ,te.date
                            FROM 
                                time_entry te
                                , project p
                                , activity a
                            WHERE 
                                te.task = a.uuid 
                                AND a.costunit = p.cost_unit_id 
                            GROUP BY 
                                p.cost_unit_id
                                , p.id
                                )te 
                    ON cu.uuid = te.cost_unit_id
            WHERE id = " + ar[0]"
            ) i
        on d.Date = i.Date
    WHERE
        d.date BETWEEN
        'firstTime'
        AND
        'secondTime'

您可以根据需要将空值合并为 0,或者经常在做这样的事情时我想按日期分组,然后对相关值进行 sum()

再看一下 SQL 我 认为 它应该可以工作,但我想我会稍微不同地编写内部查询:

Select 
    d.Date
    ,Projekt_ID
    ,Projektname
    ,Ist
FROM
    DatesTable as d
    LEFT OUTER JOIN (
            SELECT 
                id AS Projekt_ID
                ,cu.name AS Projektname
                ,effort AS Ist 
                ,te.date
            FROM 
                (
                    SELECT 
                        p.cost_unit_id
                        ,SUM(te.effort) AS effort
                        ,p.id AS id
                        ,te.date
                    FROM 
                        time_entry te
                        inner join activity a
                            on te.task = a.uuid 
                        inner join  project 
                            on a.costunit = p.cost_unit_id 
                    GROUP BY 
                        p.cost_unit_id
                        ,p.id
                        ,te.date
                        ) as te 
                LEFT OUTER JOIN cost_unit cu 
                    ON cu.uuid = te.cost_unit_id
            WHERE id = " + ar[0]"
            ) i
        on d.Date = i.Date
    WHERE
        d.date BETWEEN
        'firstTime'
        AND
        'secondTime'

如果您想在 SUM(te.effort) 中返回 0 而不是 null,请尝试使用 isnull。例如:

SELECT id AS Projekt_ID, cu.name AS Projektname, isnull(effort,0) AS Ist

但我注意到,您只能获得 Projekt_ID 和 Projektname。您可能还想在查询中看到 activity 吗?为此你还需要 left join activity table

SELECT id AS Projekt_ID, cu.name AS Projektname, a.activityname, isnull(effort,0) AS Ist 
FROM cost_unit cu 
LEFT OUTER JOIN activity a on 1=1
LEFT OUTER JOIN 
    (SELECT p.cost_unit_id, SUM(te.effort) AS effort, p.id AS id
    FROM time_entry te, project p, activity a
    WHERE te.task = a.uuid AND a.costunit = p.cost_unit_id AND te.date BETWEEN
            'firstTime'
            AND
            'secondTime'
    GROUP BY p.cost_unit_id, p.id) te 
ON cu.uuid = te.cost_unit_id
                    WHERE id = " + ar[0]

您的 ID 字段不是来自 cost_unit,而是来自带有 LEFT 连接的子查询。 尝试在查询的主要部分获取项目

SELECT p.id AS Projekt_ID, cu.name AS Projektname, coalesce(effort, 0)  AS Ist 
FROM cost_unit cu 
INNER JOIN project p on p.cost_unit_id = cu.uuid
LEFT OUTER JOIN 
    (SELECT a.costunit, SUM(te.effort) AS effort
    FROM time_entry te,  activity a
    WHERE te.task = a.uuid 
    AND te.date BETWEEN
                    'firstTime'
                    AND
                    'secondTime'
    GROUP BY a.costunit)te ON te.costunit = p.cost_unit_id
WHERE id = " + ar[0]