2013-04-16 53 views
1

使用的MS SQL Server 8.0.760(2000)SQL生成丟失記錄SELECT

我有這樣的一個表:

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 

回答

1

可以創建名爲集裝箱您的小時表(可能是暫時的)(你的榜樣從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 
+0

檢查編輯...:/ – RaphaelH

+0

完美!謝謝! :) – RaphaelH

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 [email protected] 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 [email protected] 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