2017-03-22 100 views
0

在case語句中,可以用不同的THEN輸出顯示相同的值。在case語句中用不同的THEN輸出顯示相同的值兩次

我已經在下面顯示了一個基本示例。

CASE 
    WHEN DateTime = '2017-03-22 10:00:00.620' THEN 1 
    WHEN DateTime = '2017-03-22 10:00:00.620' THEN 2 
    ELSE DateTime 
END AS DateTime2 

一個過程每天運行幾次並給出一個訂單號的時間。不幸的是,它可能會失敗,所以在下面的例子中,在22日08:00沒有運行。所以我想要在10:00的那個有作爲訂單。我將在case語句中手動完成此操作。

DateTime     Order 
2017-03-21 00:00:00.610  1 
2017-03-21 08:00:00.467  2 
2017-03-21 10:00:00.770  3 
2017-03-21 13:00:00.537  4 
2017-03-21 16:00:00.603  5 
2017-03-21 20:00:00.110  6 
2017-03-22 00:00:00.593  1 
2017-03-22 10:00:00.620  2 

2017-03-22 10:00:00.620  3 This time will have 2 and 3 as the order 

非常感謝您的幫助。

+2

添加一些所需的輸出 – 2017-03-22 12:43:13

+1

'CASE'將顯示第一個輸出,然後停止。爲什麼它應該繼續,如果它已經遇到了'真'的CASE? – waka

+2

沒有意義這樣做。你能告訴確切的要求是什麼嗎? – Sid

回答

0

我認爲它的回答是否定的。我已經用下面給出的示例數據對它進行了測試。

Create Table #Temp(Name nvarchar(max)) 
Insert Into #Temp Values('Rohit') 

Alter Table #temp Add T1 datetime 

Update #temp set T1=GETDATE() 

    Select *, 
    CASE 
    WHEN T1 ='2017-03-22 18:17:01.780' THEN 1 
     WHEN T1 = '2017-03-22 18:17:01.780' THEN 2 
END AS DateTime2 
    from #Temp 
+0

謝謝你的建議 – Mally

0

嘗試下面的查詢,這會給你所需的確切輸出

DECLARE @TEST_TABLE TABLE(SNO INT,COL_TIME DATETIME) 
INSERT INTO @TEST_TABLE VALUES 
(1,'2017-03-21 00:00:00.610'), 
(2,'2017-03-21 08:00:00.467'), 
(3,'2017-03-21 10:00:00.770'), 
(4,'2017-03-21 13:00:00.537'), 
(5,'2017-03-21 16:00:00.603'), 
(6,'2017-03-21 20:00:00.110'), 
(7,'2017-03-22 00:00:00.593'), 
(8,'2017-03-22 10:00:00.620'), 
(9,'2017-03-22 10:00:00.620') 

;WITH TABLE_DATA 
AS 
(SELECT *,(SELECT COL_TIME FROM @TEST_TABLE T2 
WHERE T2.SNO=T1.SNO+1)LAST_COL1, 
    ISNULL((SELECT CASE WHEN   CONVERT(VARCHAR,T3.COL_TIME,101)=CONVERT(VARCHAR,T1.COL_TIME,101) 
     THEN 1 ELSE 0 END FROM @TEST_TABLE T3 WHERE T3.SNO=T1.SNO-  1),1)LAST_COL FROM @TEST_TABLE T1) 
    ,TEST_TABLE1 
    AS 
    ( SELECT SNO,COL_TIME,LAST_COL,LAST_COL NUM FROM TABLE_DATA WHERE  SNO=1 
    UNION ALL 
     SELECT TT2.SNO,TT2.COL_TIME,TT2.LAST_COL,CASE WHEN TT2.LAST_COL=0  THEN 1  ELSE NUM+TT2.LAST_COL END FROM TEST_TABLE1 TT1 JOIN TABLE_DATA TT2 
     ON TT1.SNO=TT2.SNO-1 
    WHERE NUM<=100 
) SELECT COL_TIME [DateTime],NUM [Order] FROM TEST_TABLE1 

輸出

------------------------------------- 
--DateTime     Order 
------------------------------------- 
2017-03-21 00:00:00.610  1 
2017-03-21 08:00:00.467  2 
2017-03-21 10:00:00.770  3 
2017-03-21 13:00:00.537  4 
2017-03-21 16:00:00.603  5 
2017-03-21 20:00:00.110  6 
2017-03-22 00:00:00.593  1 
2017-03-22 10:00:00.620  2 
2017-03-22 10:00:00.620  3 
------------------------------------- 
0

這應該爲你工作。不過,我會建議你添加任何標識列(如果可用的話,排序函數中的order by子句使它更加一致)。希望能幫助到你。

;WITH cte_Data(DateTimes) AS 
(
SELECT CAST('2017-03-21 00:00:00.610' AS DATETIME) UNION ALL 
SELECT '2017-03-21 08:00:00.467' UNION ALL 
SELECT '2017-03-21 10:00:00.770' UNION ALL 
SELECT '2017-03-21 13:00:00.537' UNION ALL 
SELECT '2017-03-21 16:00:00.603' UNION ALL 
SELECT '2017-03-21 20:00:00.110' UNION ALL 
SELECT '2017-03-22 00:00:00.593' UNION ALL 
SELECT '2017-03-22 10:00:00.620' UNION ALL 
SELECT '2017-03-22 10:00:00.620' 
) 
SELECT DateTimes, 
    ROW_NUMBER() OVER (PARTITION BY CAST(DateTimes AS DATE) ORDER BY DateTimes ASC) AS [Order] 
FROM cte_Data 
相關問題