2013-08-07 137 views
2

我有兩個查詢返回一個帶有計數的服務項目列表。一個用於整個數據庫,另一個用於特定的時間段。他們單獨工作,但我想優化他們到一個單一的查詢。結合來自同一來源的兩個計數查詢

這兩個查詢是:

SELECT service_type, count(service_type) from qba_customers group by service_type order by count(service_type) desc 

SELECT service_type, count(service_type) from qba_customers WHERE created_on BETWEEN '2013-01-01' AND '2013-06-30' group by service_type order by count(service_type) desc 

我嘗試了一些事情失敗,下面是我的想法最初將工作:提前

SELECT service_type, COUNT(service_type) AS full_count, (count(service_type) WHERE created_on BETWEEN '2013-01-01' AND '2013-06-30') AS period_count FROM qba_customers GROUP BY service_type ORDER BY service_type DESC 

謝謝!

回答

0

所有集合函數(包括COUNT)只會包含值(如果不是NULL)。要僅計算日期範圍內的行,請使用CASE構造作爲計數參數。如果CASE返回一個值,則它被計數。如果它不返回一個值,它不計算在內:

SELECT 
    service_type, 
    COUNT(service_type) AS GrandTotal, 
    COUNT(CASE WHEN created_on BETWEEN '2013-01-01' AND '2013-06-30' THEN 1 END) AS FirstHalf2013 
FROM qba_customers 
GROUP BY service_type 
ORDER BY GrandTotal 

對於FirstHalf2013列,如果created_on在目標範圍內的情況下返回一個非空值(我用1這裏,但它可能是任何非空值)。如果created_on不在目標範圍內,CASE返回NULL,這意味着該行不計算在內。

+0

我試圖用的情況下,卻沒有足夠的 'THEN 1 END'。我讀了一些其他答案,並在發佈後的時刻找到了答案。非常感謝您的回答!我在合併/優化查詢方面很糟糕,今晚我還有更多事情要做,所以請留意! :d – Dizzy49

0

嘗試使用case語句:

SELECT service_type, 
     count(service_type) as full_count, 
     sum(case when created_on between '2013-01-01' and '2013-06-30' then 1 else 0 end) as period_count 
    FROM qba_customers 
GROUP by service_type 
ORDER by service_type desc 
相關問題