如何使用SQL将不同的字符串分组?

时间:2014-07-29 19:20:55

标签: sql sql-server-2008 group-by

表:发票

InvoiceID   Status
=========   =======
1           Incompleted
1           Incompleted
2           Completed
2           Incompleted
3           Completed
3           Completed
4           Incompleted
4           Incompleted
4           Completed

我的预期结果:

InvoiceID   Status
=========   ======
1           Incompleted
2           Incompleted
3           Completed
4           Incompleted

分组的逻辑是,
如果在对“ID”和“状态”进行分组时,“状态”列中存在未完成,则 然后返回“Incompleted”;
如果在分组时,“状态”列中仅存在已完成,则 然后返回“已完成”;

SQL:

SELECT InvoiceID, Status
FROM Invoice
GROUP BY InvoiceID, Status

(这个sql输出的结果不是我预期的。而且我不知道如何在Status列中实现逻辑)
任何人都有这个想法?提前谢谢。

2 个答案:

答案 0 :(得分:4)

试试这个:

SELECT InvoiceID, MAX(Status)
FROM Invoice
GROUP BY InvoiceID

Sql Server应该认为Incompleted大于Completed。如果InvoiceID中有任何Incompleted,则会返回,否则为Completed。如果您有一个奇怪的coalation并且MAX返回Completed,那么只需使用min。

答案 1 :(得分:0)

  1. 在内部查询中,只获取“未完成”状态。链接查询的最高查询 匹配的id将获取所有'Incompleted'。
  2. 在内部查询中,只获取“未完成”状态。链接查询的最高查询 不匹配的id将获取所有'Completed'。
  3. 获得工会
  4. SELECT distinct st1.InvoiceID, 'Incompleted' as Status FROM StatusTest st1  
    where InvoiceID in  
    (select distinct InvoiceID from StatusTest st2 where status = 'Incompleted')  
    UNION  
    SELECT distinct st1.InvoiceID, 'Completed'  as Status FROM StatusTest st1  
    where InvoiceID not in  
    (select distinct InvoiceID from StatusTest st2 where status = 'Incompleted')  
    order by InvoiceID