Sql 重复填充缺少的0值
例如,我有以下数据:Sql 重复填充缺少的0值,sql,sql-server,Sql,Sql Server,例如,我有以下数据: shift date value ---------------------- A 2014-07-01 5 A 2014-07-02 8 A 2014-07-03 2 B 2014-07-03 1 C 2014-07-03 9 如何创建视图,每天的所有班次(A、B、C)在哪里 shift date value ---------------------- A
shift date value
----------------------
A 2014-07-01 5
A 2014-07-02 8
A 2014-07-03 2
B 2014-07-03 1
C 2014-07-03 9
如何创建视图,每天的所有班次(A、B、C)在哪里
shift date value
----------------------
A 2014-07-01 5
B 2014-07-01 0 // add 0 value for B to 1.7.2014
C 2014-07-01 0 // add 0 value for C to 1.7.2014
A 2014-07-02 8
B 2014-07-02 0 // add 0 value for B to 2.7.2014
C 2014-07-02 0 // add 0 value for C to 2.7.2014
A 2014-07-03 2
B 2014-07-03 1
C 2014-07-03 9
我需要每天填写所有三个生产班次(A、B、C),其中至少有一个班次报告了一些工作
DECLARE @table TABLE (shift CHAR(1), date Date, Value INT)
INSERT INTO @table SELECT 'A', '2014-07-01', 5
INSERT INTO @table SELECT 'A', '2014-07-02', 8
INSERT INTO @table SELECT 'A', '2014-07-03', 2
INSERT INTO @table SELECT 'B', '2014-07-03', 1
INSERT INTO @table SELECT 'C', '2014-07-03', 9
;WITH shifts AS (
SELECT DISTINCT Shift
FROM @table
), allDates AS (
SELECT DISTINCT date
FROM @table
)
SELECT S.Shift, AD.date, ISNULL(T.Value, 0) AS Value
FROM allDates AS AD
CROSS JOIN shifts AS S
LEFT JOIN @table AS T
ON T.Shift = S.Shift
AND T.Date = AD.Date
ORDER BY AD.date, S.Shift
结果:
Shift| date |Value
A |2014-07-01|5
B |2014-07-01|0
C |2014-07-01|0
A |2014-07-02|8
B |2014-07-02|0
C |2014-07-02|0
A |2014-07-03|2
B |2014-07-03|1
C |2014-07-03|9
shift date value
A 2014-07-01 5
B 2014-07-01 0
C 2014-07-01 0
A 2014-07-02 8
B 2014-07-02 0
C 2014-07-02 0
A 2014-07-03 2
B 2014-07-03 1
C 2014-07-03 9
这里是一个例子,如果你不想把丢失的日期
DECLARE @table TABLE (shift CHAR(1), date Date, Value INT)
INSERT INTO @table SELECT 'A', '2014-07-01', 5
INSERT INTO @table SELECT 'A', '2014-07-02', 8
INSERT INTO @table SELECT 'A', '2014-07-03', 2
INSERT INTO @table SELECT 'B', '2014-07-03', 1
INSERT INTO @table SELECT 'C', '2014-07-03', 9
;WITH shifts AS (
SELECT DISTINCT Shift
FROM @table
), allDates AS (
SELECT DISTINCT date
FROM @table
)
SELECT S.Shift, AD.date, ISNULL(T.Value, 0) AS Value
FROM allDates AS AD
CROSS JOIN shifts AS S
LEFT JOIN @table AS T
ON T.Shift = S.Shift
AND T.Date = AD.Date
ORDER BY AD.date, S.Shift
结果:
Shift| date |Value
A |2014-07-01|5
B |2014-07-01|0
C |2014-07-01|0
A |2014-07-02|8
B |2014-07-02|0
C |2014-07-02|0
A |2014-07-03|2
B |2014-07-03|1
C |2014-07-03|9
shift date value
A 2014-07-01 5
B 2014-07-01 0
C 2014-07-01 0
A 2014-07-02 8
B 2014-07-02 0
C 2014-07-02 0
A 2014-07-03 2
B 2014-07-03 1
C 2014-07-03 9
首先将班次与日期交叉连接,以获得所有组合。然后左键连接表中已有的所有组合
select shift.shift, dates.date, coalesce(mytable.value,0)
from (select distinct shift from mytable) shifts
cross join (select distinct date from mytable) dates
left join mytable on mytable.shift = shifts.shift and mytable.date = dates.date;
首先将班次与日期交叉连接,以获得所有组合。然后左键连接表中已有的所有组合
select shift.shift, dates.date, coalesce(mytable.value,0)
from (select distinct shift from mytable) shifts
cross join (select distinct date from mytable) dates
left join mytable on mytable.shift = shifts.shift and mytable.date = dates.date;
注意,如果您错过了一些日期,这也会起作用 测试表A数据
declare @t table(shift char(1), date date, value int)
insert @t values
('A','2014-07-01',5),
('A','2014-07-02',8),
('A','2014-07-03',2),
('B','2014-07-03',1),
('C','2014-07-03',9)
查询:
;WITH CTE1 as
(
SELECT min(date) MinDate, max(date) MaxDate
FROM @t
), CTE2 as
(
SELECT MinDate as date, MaxDate
FROM CTE1
UNION ALL
SELECT DATEADD(day, 1, date), Maxdate
FROM CTE2
WHERE date < Maxdate
), CTE3 as
(
SELECT distinct shift
FROM @t
)
SELECT
CTE3.shift,
CTE2.date,
coalesce(t.value, 0) value
FROM CTE2
CROSS JOIN CTE3
LEFT JOIN @t t
ON
CTE3.shift = t.shift and
CTE2.date = t.date
ORDER BY
date,
shift
注意,如果您错过了一些日期,这也会起作用 测试表A数据
declare @t table(shift char(1), date date, value int)
insert @t values
('A','2014-07-01',5),
('A','2014-07-02',8),
('A','2014-07-03',2),
('B','2014-07-03',1),
('C','2014-07-03',9)
查询:
;WITH CTE1 as
(
SELECT min(date) MinDate, max(date) MaxDate
FROM @t
), CTE2 as
(
SELECT MinDate as date, MaxDate
FROM CTE1
UNION ALL
SELECT DATEADD(day, 1, date), Maxdate
FROM CTE2
WHERE date < Maxdate
), CTE3 as
(
SELECT distinct shift
FROM @t
)
SELECT
CTE3.shift,
CTE2.date,
coalesce(t.value, 0) value
FROM CTE2
CROSS JOIN CTE3
LEFT JOIN @t t
ON
CTE3.shift = t.shift and
CTE2.date = t.date
ORDER BY
date,
shift
给你
SELECT SHIFTS,DATES, 0 AS VALUE FROM
(SELECT DISTINCT Z.A AS SHIFTS,Z.DATES AS DATES FROM
(SELECT B.A ,DATES,SHIFT,VALUE FROM #A
CROSS JOIN (SELECT 'A'AS A UNION SELECT 'B' B UNION SELECT 'C' AS C) B)Z
EXCEPT
SELECT SHIFT,DATES FROM #A)R
UNION
SELECT SHIFT,DATES,VALUE FROM #A
ORDER BY DATES,SHIFTS
给你
SELECT SHIFTS,DATES, 0 AS VALUE FROM
(SELECT DISTINCT Z.A AS SHIFTS,Z.DATES AS DATES FROM
(SELECT B.A ,DATES,SHIFT,VALUE FROM #A
CROSS JOIN (SELECT 'A'AS A UNION SELECT 'B' B UNION SELECT 'C' AS C) B)Z
EXCEPT
SELECT SHIFT,DATES FROM #A)R
UNION
SELECT SHIFT,DATES,VALUE FROM #A
ORDER BY DATES,SHIFTS
是否从同一个表中提取数据?还是两张不同的桌子?你能提供db模式plz吗?它只是一个表。我需要每天填写所有三个生产班次(A、B、C),其中至少有一个班次报告了了解表模式的一些工作困难。是否至少提供返回第一个结果的查询?是否从同一个表中获取数据?还是两张不同的桌子?你能提供db模式plz吗?它只是一个表。我需要每天填写所有三个生产班次(A、B、C),其中至少有一个班次报告了了解表模式的一些工作困难。至少提供返回第一个结果的查询