重复填充缺失的0值

时间:2014-10-10 11:17:18

标签: 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    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),其中至少有一个班次报告了一些工作

4 个答案:

答案 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
相关问题