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]
我正在阅读三个不同的 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]