【发布时间】:2020-04-24 03:03:50
【问题描述】:
【问题讨论】:
-
你能举个例子解释一下你的逻辑吗?
-
我正在尝试为所有 ID 重复日期。我有第一张图片所示的数据。我想为所有 id 重复一个日期,例如所有 id 的 01-02-2020,如果 id 在该日期没有值则设置为 0。
标签: sql date recursion missing-data
【问题讨论】:
标签: sql date recursion missing-data
只需使用cross join 生成行并使用left join 引入现有值:
select i.id, t.date, coalesce(t.value, 0) as value
from (select distinct id from t) i cross join
(select distinct date from t) left join
t
on t.id = i.id and t.date = i.date;
您可以使用insert into 或select into 将此数据放入另一个表中。
【讨论】:
我在 SQL Server 中尝试过以下示例。
DECLARE @FromDate DATETIME, @ToDate DATETIME;
SET @FromDate = '2020-02-01';
SET @ToDate = '2020-02-28';
DECLARE @DateTable TABLE(theDate DATE)
DECLARE @datasource TABLE(id int, dateVal DATE, Val INT)
-- all days in that period
INSERT INTO @DateTable
SELECT TOP (DATEDIFF(DAY, @FromDate, @ToDate)+1)
TheDate = CAST(DATEADD(DAY, number, @FromDate) AS DATE)
FROM [master].dbo.spt_values
WHERE [type] = N'P' ORDER BY number;
--
INSERT INTO @datasource
VALUES
(59895,'2020-02-01',5),(59895,'2020-02-03',7),
(59888,'2020-02-01',2),(59888,'2020-02-02',10)
;WITH CTE_idDates AS
(
SELECT theDate,id FROM @DateTable
CROSS JOIN
@datasource
)
SELECT theDate, id,
COALESCE((SELECT Val from @dataSource WHERE dateval=c.thedate and id=c.id),0)
FROM CTE_idDates AS c
结果集
+------------+-------+------------------+
| theDate | id | (No column name) |
+------------+-------+------------------+
| 2020-02-01 | 59895 | 5 |
| 2020-02-02 | 59895 | 0 |
| 2020-02-03 | 59895 | 7 |
| 2020-02-04 | 59895 | 0 |
| 2020-02-05 | 59895 | 0 |
| 2020-02-06 | 59895 | 0 |
.
.
.
| 2020-02-28 | 59895 | 0 |
| 2020-02-01 | 59888 | 2 |
| 2020-02-02 | 59888 | 10 |
.
.
.
| 2020-02-26 | 59888 | 0 |
| 2020-02-27 | 59888 | 0 |
| 2020-02-28 | 59888 | 0 |
+------------+-------+------------------+
【讨论】: