2016-09-14 89 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