2012-10-16 99 views
1

我有几个代码声明如下,我想找出一种方法,使这更简单和更容易。我会假设CASE声明是最好的,但经过几天的试验和错误之后,我一直无法弄清楚如何去做。任何和所有的帮助和/或解释将不胜感激。案例陈述,而不是多个选择

select Count(lcs.statename) as [Name 1] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Follow Up' 
    AND lcnum = '412' 
    AND status = '0' 
select Count(lcs.statename) as [Name 2] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Initial Review' 
    AND lcnum = '412' 
    AND status = '0' 
select Count(lcs.statename) as [Name 3] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Execution' 
    AND lcnum = '412' 
    AND status = '0' 
select Count(lcs.statename) as [Name 4] 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    where lcs.statename = 'Holdback' 
    AND lcnum = '412' 
    AND status = '0' 
+1

*** SQL ***只是*结构化查询语言* - 许多数据库系统使用的语言,但不是数据库产品......语法细节是供应商特定的 - 所以我们真的需要知道什么**数据库系统**(和哪个版本),你正在使用...... –

回答

2

尝试类似:

SELECT SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1], 
    SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2], 
    SUM(CASE WHEN lcs.statename = 'Execution' THEN 1 ELSE 0 END) as [Name 3], 
    SUM(CASE WHEN lcs.statename = 'Holdback' THEN 1 ELSE 0 END) as [Name 4] 
FROM hsi.itemlc as ilc 
LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
WHERE lcnum = '412' 
AND status = '0' 
+0

这工作完美...几天下来,但感谢一百万 – John

+0

现在,如果我要添加其他列......我收到了“消息8120,级别16,状态1,行1 列'hsi.itemlc.itemnum'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。”试图在SELECT后添加 ilc.itemnum as [test]时出错 – John

+0

@John您必须将GROUP BY添加到该列中。 –

1

您可以用SUM(做)和CASE:

SELECT 
     SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1], 
     SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2], 
     ... 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    WHERE lcnum = '412' AND status = '0'; 

或者,如果你能读多行,你可以使用GROUP BY

SELECT lcs.statename, COUNT(*) AS num 
    FROM hsi.itemlc as ilc 
    LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
    WHERE lcnum = '412' AND status = '0' 
    GROUP BY lcs.statename; 

哪会给哟ü像

Follow Up  25 
Initial Review 17 
... 
0

可以使用CASE语句与SUM()功能,如下所示:

SELECT SUM(CASE WHEN lcs.statename = 'Follow Up' THEN 1 ELSE 0 END) as [Name 1], 
     SUM(CASE WHEN lcs.statename = 'Initial Review' THEN 1 ELSE 0 END) as [Name 2], 
     SUM(CASE WHEN lcs.statename = 'Execution' THEN 1 ELSE 0 END) as [Name 3], 
     SUM(CASE WHEN lcs.statename = 'Holdback' THEN 1 ELSE 0 END) as [Name 4] 
FROM hsi.itemlc as ilc 
LEFT JOIN hsi.lcstate as lcs on lcs.statenum = ilc.statenum 
WHERE lcnum = '412' 
    AND status = '0' 

这导致每个州的名字条件计数。