2016-09-14 85 views
9

這裏是我的簡單求代碼:如何GROUP BY與例外?

SELECT 
    a.user_id as User_ID, 
    min(b.a_day) as Date_from, 
    max(b.a_day) as Date_to, 
    c.code as ID 
FROM a, b, c 
WHERE 
    a_day > (day, -15, getdate()) 
GROUP BY 
    a.user_id, 
    c.code 

查詢提供了以下的輸出:

User ID date_from date_to  id  
1234567 2016-06-13 2016-06-13 B 
1234567 2016-06-17 2016-06-17 A 
12345672016-06-18 2016-06-18 A 
1234567 2016-06-19 2016-06-19 A 
1234567 2016-06-20 2016-06-20 A 
1234567 2016-06-21 2016-06-21 C 
1234567 2016-06-22 2016-06-22 C 
1234567 2016-06-23 2016-06-23 D 

我需要的是這樣的:

User ID date_from date_to  id 
1234567 2016-06-13 2016-06-13 B 
1234567 2016-06-17 2016-06-20 A 
1234567 2016-06-21 2016-06-22 C 
1234567 2016-06-23 2016-06-23 D 

當我使用min()和max( )函數與分組相同,它彙總了所有記錄的罰款,但我必須每天只彙總具有相同ID的日期。

任何想法?

在此先感謝。

+0

添加樣本表數據。 (這給出了指定的結果。) – jarlh

回答

4

您可以通過GROUP BY子句中使用CASE EXPRESSION有條件的分組做到這一點:

SELECT 
    a.user_id as User_ID, 
    min(b.a_day) as Date_from, 
    max(b.a_day) as Date_to, 
    c.code as ID 
FROM a, b, c 
WHERE 
    a_day > (day, -15, getdate()) 
GROUP BY 
    a.user_id, 
    c.code, 
    CASE WHEN c.code in ('B','D') THEN b.a_day ELSE 1 END 

將生成以此爲GROUP BY條款:

c.code = 'B' -> a.user_id,c.code,b.a_day 
c.code <> 'B' -> a.user_id,c.code,1 
+0

感謝您的回答,但是我有更多的ID而不僅僅是A和B.所以我無法獲得依賴這些記錄的數據。我認爲它應該檢查是否有一些續約日期,然後分別爲兩組(分別爲連續和單日)分組。 – aoc24

+0

我不明白,你應該在問題中提到一切!這裏有什麼問題?還有更多的代碼應該每天分組?他們是哪一個? – sagi

+0

對不起。 ID可以是A,B,C,D等。對於我來說最重要的是找到一種解決方案,使得可以獲得具有相同ID的單日和日日期的數據。剛剛添加到我的代碼另一個ID。 – aoc24