TSQL - 对于没有值的日期,将缺失值填充为 0
TSQL - Fill in missing values as 0 for dates without a value
提前为图片道歉。我将这些作为 Stack 中的表格进行了处理,它们在预览中显示良好,但一旦发布就无法正确显示。
我有一个像下面这样的示例数据集,其中包含更多 KPI。
Picture Of Tables
当前返回的数据集只是这 2 个表的连接和 returns 日期而不是日期 ID,如下所示:
查询
WITH ExampleQuery AS
(
SELECT
KPI, Value, Date
FROM
Date
LEFT JOIN
KPI ON Date.DateID = KPI.DateID
)
SELECT
KPI,
SUM(Value),
Date
FROM
ExampleQuery
GROUP BY
Date, KPI
DataSet Returned
I need the dataset to return like below (notice the additional record for KPI B on the 02-01-2022
我可以通过以下查询实现此目的,但考虑到我需要为大量 KPI 执行此操作,这非常耗时。非常感谢任何帮助我如何让它稍微动态地工作
WITH ExampleQuery AS
(
SELECT
CASE WHEN KPI = 'A' THEN Value ELSE 0 END AS ValueA,
CASE WHEN KPI = 'B' THEN Value ELSE 0 END AS ValueB,
Date,
KPI
FROM
Date
LEFT JOIN
KPI ON Date.DateID = KPI.DateID
)
SELECT
KPI, ValueA, Date
FROM
ExampleQuery
WHERE
KPI = 'A'
UNION ALL
SELECT
KPI, ValueB, Date
FROM
ExampleQuery
WHERE
KPI = 'B'
在我第二天用硬编码的 CASE 语句重写查询之前,我们将不胜感激
使用交叉连接方法,我们可以得出所有 KPI 值的集合以及所有日期的集合。然后,将其加入您的 KPI table,以确保显示所有 KPI 值的所有日期。
SELECT k.KPI, COALESCE(t.Value, 0) AS Value, d.Date
FROM (SELECT DISTINCT KPI FROM KPI) k
CROSS JOIN (SELECT Date, DateID FROM Date) d
LEFT JOIN KPI t
ON t.KPI = k.KPI AND t.DateID = d.DateID
ORDER BY k.KPI, d.Date;
您希望每个日期和 KPI 类型一个结果。所以交叉连接两者然后外部连接你的数据。
select
date.date,
type.kpi,
coalesce(sum(kpi.value), 0) as total
from date
cross join (select distinct kpi from kpi) type
left join kpi on kpi.dateid = date.dateid and kpi.kpi = type.kpi
group by date.date, type.kpi
order by date.date, type.kpi;
提前为图片道歉。我将这些作为 Stack 中的表格进行了处理,它们在预览中显示良好,但一旦发布就无法正确显示。
我有一个像下面这样的示例数据集,其中包含更多 KPI。
Picture Of Tables
当前返回的数据集只是这 2 个表的连接和 returns 日期而不是日期 ID,如下所示: 查询
WITH ExampleQuery AS
(
SELECT
KPI, Value, Date
FROM
Date
LEFT JOIN
KPI ON Date.DateID = KPI.DateID
)
SELECT
KPI,
SUM(Value),
Date
FROM
ExampleQuery
GROUP BY
Date, KPI
DataSet Returned
I need the dataset to return like below (notice the additional record for KPI B on the 02-01-2022
我可以通过以下查询实现此目的,但考虑到我需要为大量 KPI 执行此操作,这非常耗时。非常感谢任何帮助我如何让它稍微动态地工作
WITH ExampleQuery AS
(
SELECT
CASE WHEN KPI = 'A' THEN Value ELSE 0 END AS ValueA,
CASE WHEN KPI = 'B' THEN Value ELSE 0 END AS ValueB,
Date,
KPI
FROM
Date
LEFT JOIN
KPI ON Date.DateID = KPI.DateID
)
SELECT
KPI, ValueA, Date
FROM
ExampleQuery
WHERE
KPI = 'A'
UNION ALL
SELECT
KPI, ValueB, Date
FROM
ExampleQuery
WHERE
KPI = 'B'
在我第二天用硬编码的 CASE 语句重写查询之前,我们将不胜感激
使用交叉连接方法,我们可以得出所有 KPI 值的集合以及所有日期的集合。然后,将其加入您的 KPI table,以确保显示所有 KPI 值的所有日期。
SELECT k.KPI, COALESCE(t.Value, 0) AS Value, d.Date
FROM (SELECT DISTINCT KPI FROM KPI) k
CROSS JOIN (SELECT Date, DateID FROM Date) d
LEFT JOIN KPI t
ON t.KPI = k.KPI AND t.DateID = d.DateID
ORDER BY k.KPI, d.Date;
您希望每个日期和 KPI 类型一个结果。所以交叉连接两者然后外部连接你的数据。
select
date.date,
type.kpi,
coalesce(sum(kpi.value), 0) as total
from date
cross join (select distinct kpi from kpi) type
left join kpi on kpi.dateid = date.dateid and kpi.kpi = type.kpi
group by date.date, type.kpi
order by date.date, type.kpi;