1

使用 MS SQL Server 8.0.760 (2000)

我有一个这样的表:

Table A
Day       | Hour | Value
2012-10-01| 12   | 780
2012-10-01| 14   | 678
2012-11-02| 08   | 123
2012-11-02| 09   | 473

预期结果应该是:

Day       | Hour | Value
2012-10-01| 00   | 0
2012-10-01| 01   | 0
2012-10-01| 02   | 0
2012-10-01| ..   | ..
2012-10-01| 12   | 780
2012-10-01| 13   | 0
2012-10-01| 14   | 678
2012-10-01| ..   | ..
2012-10-01| 22   | 0
2012-10-01| 23   | 0
2012-10-01| 24   | 0
2012-11-02| 00   | 0
2012-11-02| 01   | 0
2012-11-02| 02   | 0
2012-11-02| ..   | ..
2012-11-02| 08   | 123
2012-11-02| 09   | 473
2012-11-02| ..   | ..
2012-11-02| 22   | 0
2012-11-02| 23   | 0
2012-11-02| 24   | 0

所以缺少的时间是用零值生成的。

任何想法?

编辑 1

试过这个:

DECLARE @tmpHours TABLE
(
tmpHour varchar(2)
)

INSERT INTO @tmpHours VALUES ('00')
INSERT INTO @tmpHours VALUES ('01')
...
INSERT INTO @tmpHours VALUES ('23')
INSERT INTO @tmpHours VALUES ('24')

SELECT * FROM [A]
  FULL JOIN @tmpHours tmp ON tmp.[tmpHour] = [A].[Hour]
  ORDER BY [Day], [Hour], [tmpHour]

但这会产生:

Day Hour    Value   tmpHour
NULL    NULL    NULL    00
NULL    NULL    NULL    01
NULL    NULL    NULL    02
NULL    NULL    NULL    03
NULL    NULL    NULL    04
NULL    NULL    NULL    05
NULL    NULL    NULL    06
NULL    NULL    NULL    07
NULL    NULL    NULL    10
NULL    NULL    NULL    11
NULL    NULL    NULL    13
NULL    NULL    NULL    15
NULL    NULL    NULL    16
NULL    NULL    NULL    17
NULL    NULL    NULL    18
NULL    NULL    NULL    19
NULL    NULL    NULL    20
NULL    NULL    NULL    21
NULL    NULL    NULL    22
NULL    NULL    NULL    23
NULL    NULL    NULL    24
2012-10-01 00:00:00.000 12  780 12
2012-10-01 00:00:00.000 14  678 14
2012-11-02 00:00:00.000 08  123 08
2012-11-02 00:00:00.000 09  473 09
4

2 回答 2

1

您可以创建一个名为 container your hours 的表(可能是临时表)(您的示例显示从 00 到 24 的 25 小时,但我想您想要 24 小时)。Table A然后,您可以在HOURS 表之间进行外部连接。这将生成NULL值而不是 0 值。如果需要,您可以使用函数将 NULL 值转换为 0。

编辑将答案重构为单个 SQL 查询:

SELECT X.*, A.VALUE
FROM  A
RIGHT OUTER JOIN
(
SELECT *
FROM
       (SELECT DISTINCT A.DAY FROM A) DAYS,
       (SELECT 0 HOUR
        UNION ALL SELECT 1 HOUR
        UNION ALL SELECT 2 HOUR
        UNION ALL SELECT 3 HOUR
        UNION ALL SELECT 4 HOUR
        UNION ALL SELECT 5 HOUR
        UNION ALL SELECT 6 HOUR
        UNION ALL SELECT 7 HOUR
        UNION ALL SELECT 8 HOUR
        UNION ALL SELECT 9 HOUR
        UNION ALL SELECT 10 HOUR
        UNION ALL SELECT 11 HOUR
        UNION ALL SELECT 12 HOUR
        UNION ALL SELECT 13 HOUR
        UNION ALL SELECT 14 HOUR
        UNION ALL SELECT 15 HOUR
        UNION ALL SELECT 16 HOUR
        UNION ALL SELECT 17 HOUR
        UNION ALL SELECT 18 HOUR
        UNION ALL SELECT 19 HOUR
        UNION ALL SELECT 20 HOUR
        UNION ALL SELECT 21 HOUR
        UNION ALL SELECT 22 HOUR
        UNION ALL SELECT 23 HOUR
        ) HOURS
) X
ON X.DAY = A.DAY AND X.HOUR = A.HOUR
于 2013-04-16T06:42:33.293 回答
0

尝试以下步骤。这将是一个非常动态的。(注意:同一日期 00 和 24 不会出现)

--Create Table :
Create Table #Table
(
    Day Date,
    Hour Int,
    Value Int
)
Go

-- Insert Values :
Insert into #Table Values('2012-10-01','12','780')
Insert into #Table Values('2012-10-01','14','678')
Insert into #Table Values('2012-10-02','08','123')
Insert into #Table Values('2012-10-02','09','473')
Go

--View Data :
Select * from #Table

Declare @TempTable as Table
(Day Date,Hour Int,Value Int)

Declare @Date Date
Declare @i Int
Set @i = 0

--Using Cursor :
Declare cur  Cursor
for
Select Distinct Day from #Table 

Open cur
Fetch Next From cur Into  @Date

While @@Fetch_status = 0
BEGIN
      While (@i <=23)
      Begin
            If not exists (Select 1 from #Table Where Day =@Date and Hour = @i )
            Begin
                    Insert into @TempTable Values (@Date,@i,0)      
            End 
            Else
            Begin
                Insert into @TempTable 
                Select Day,Hour,Value from #Table Where Day =@Date and Hour = @i                    
            End         

            Set @i = @i + 1         
        End
        Fetch Next From cur Into @Date
End      
Close cur
Deallocate cur

--Results :
Select * from @TempTable

--Clean Up :
Drop Table #Table
于 2013-04-16T10:49:37.457 回答