2012-07-31 76 views
2

我試圖理解這是如何工作的,但還無法弄清楚。選擇不按預期方式工作的情況下

我做了這個簡單的uery測試案例的時候,當時的最終條款等

SELECT case when quantity > 3 
       then count(*) end the_count_a, 
     case when quantity <= 3 
       then count(*) end the_count_b 
    FROM STOCK 

我的股票表有30個項目有不同的數量,僅10個項目有數量超過3但這總是回到30 ....爲什麼? 我認爲它應該返回兩列值:10和20

任何幫助將不勝感激! Thx, Leo

回答

4

count(*)的值表示所有記錄(在當前組中)的計數,而不管它放置在何處。如果你要算匹配條件的記錄,您需要反轉你的case語句:

select count(case when quantity > 3 then 1 end) the_count_a, 
     count(case when quantity <= 3 then 1 end) the_count_b 
    from stock 
+0

謝謝!我以爲我寫了它,因爲我會在oracle分貝...它的作品! Thx再次! – Leo 2012-07-31 23:42:48

0

聚合函數COUNT()GROUP BY的由於缺少將返回在沒有被過濾通過WHERE表中所有行條款。在你的情況,你真正需要的是兩個子查詢或UNION,這取決於如果你想列或行回:

/* Return columns with subselects */ 
SELECT 
    (SELECT COUNT(*) FROM STOCK WHERE quantity > 3) AS the_count_a 
    (SELECT COUNT(*) FROM STOCK WHERE quantity <= 3) AS the_count_b 

MySQL是寬鬆有關FROM條款的存在,所以它可以從外可以省略查詢。

/* Return rows instead of columns with UNION */ 
SELECT 
    COUNT(*) AS the_count, 
    'the_count_a' 
FROM STOCK WHERE quantity > 3 
UNION ALL 
SELECT 
    COUNT(*) AS the_count, 
    'the_count_b' 
FROM STOCK WHERE quantity <= 30 
+0

感謝Michael的快速回答! – Leo 2012-07-31 23:46:26

1
SELECT 
     count(case when quantity > 3 then 1 else null end) end the_count_a, 
     count(case when quantity <= 3 then 1 else null end) end the_count_b 
FROM STOCK 
+0

非常感謝這封郵件! – Leo 2012-07-31 23:45:55