我有以下数据:
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),其中至少有一个班次报告了一些工作
答案 0 :(得分:3)
以下是您不想错过日期的示例...
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
答案 1 :(得分:1)
首先使用日期交叉加入班次以获得所有组合。然后左键加入你表中已有的所有组合。
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;
答案 2 :(得分:1)
请注意,如果您缺少某些日期,这也会有效
测试表数据
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
结果:
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
答案 3 :(得分:1)
你去吧
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