2012-10-16 27 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' 

這導致每個州的名字條件計數。