Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 重复填充缺少的0值_Sql_Sql Server - Fatal编程技术网

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),其中至少有一个班次报告了了解表模式的一些工作困难。至少提供返回第一个结果的查询