如何使用例外进行GROUP BY?

时间:2016-09-14 07:21:15

标签: sql sql-server

这是我简洁的代码:

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

Query提供以下输出:

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()函数与group by一起使用时,它会聚合所有记录的罚款,但我必须每天只聚合具有相同ID的日期。

有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:4)

您可以使用CASE EXPRESSION子句中的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,
   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