2016-02-10 63 views
1

我有一個Shipments表,basicly包含日期,裝運數據是否有可能通過一個查詢中的不同條件來計數?

ID是integer dateshipped是date

id dateshipped 
1  1-JAN-16 
2  1-JAN-16 
3  3-FEB-16 
4  9-FEB-16 

我想編寫一個查詢其計算基於月的所有貨物。 我應該得到的是:

Jan Feb March.... 
2  2  0 

我知道我可以通過使每個列的查詢做,只得到相關的行此特定月份,只是指望他們。

如下:

Select  (Select count(*) 
      from Shipments 
      Where EXTRACT(YEAR FROM dateshipped)::int=2016 and EXTRACT(MONTH FROM dateshipped)::int=1)as JAN, 
      (Select count(*) 
      from Shipments 
      Where EXTRACT(YEAR FROM dateshipped)::int=2016 and EXTRACT(MONTH FROM dateshipped)::int=2)as FEB 

這工作但其太多相同的代碼...

我wondring是否有可能與一個FROM statment每做列獲得它自己的相關行計數。

喜歡的東西:

Select COL1,COL2,COL3... 
from Shipments 
Where EXTRACT(YEAR FROM dateshipped)::int=2016; 

,並有類似:

COL1 = count only JAN records 
COL2 = count only FEB records 
.... 

也許有一些與Parations上月或任何其他解決方案?

回答

3

你需要一個支點查詢來實現這一點:

SELECT SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 1 THEN 1 ELSE 0 END) AS Jan, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 2 THEN 1 ELSE 0 END) AS Feb, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 3 THEN 1 ELSE 0 END) AS Mar, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 4 THEN 1 ELSE 0 END) AS Apr, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 5 THEN 1 ELSE 0 END) AS May, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 6 THEN 1 ELSE 0 END) AS Jun, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 7 THEN 1 ELSE 0 END) AS Jul, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 8 THEN 1 ELSE 0 END) AS Aug, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 9 THEN 1 ELSE 0 END) AS Sep, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 10 THEN 1 ELSE 0 END) AS Oct, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 11 THEN 1 ELSE 0 END) AS Nov, 
     SUM(CASE WHEN EXTRACT(MONTH FROM dateshipped)::int = 12 THEN 1 ELSE 0 END) AS Dec 
FROM Shipments 
WHERE EXTRACT(YEAR FROM dateshipped)::int=2016 
+0

爲什麼你需要組通過 – java

+2

你不需要'GROUP BY'。 –

2

嘗試的情況下用SUM函數:

Select 
    sum(case when extract(MONTH from dateshipped)=1 then 1 else 0 end) as jan, 
    sum(case when extract(MONTH from dateshipped)=2 then 1 else 0 end) as feb, 
    sum(case when extract(MONTH from dateshipped)=3 then 1 else 0 end) as march 
    ..... 
    ..... 
from Shipments 
Where EXTRACT(YEAR FROM dateshipped)::int=2016; 
3

由於9.4可以使用FILTER

SELECT 
    count(*) AS total, 
    count(*) FILTER (WHERE Extract(MONTH FROM dateshipped)::int=1) AS JAN, 
    count(*) FILTER (WHERE Extract(MONTH FROM dateshipped)::int=2) AS FEB, 
    ... 
FROM Shipments 
WHERE Extract(YEAR FROM dateshipped)::int=2016; 
+0

與其他解決方案相比,它是否會影響性能? – java

+0

@java它應該稍微快一些,但效果並不是那麼重要。雖然它對數據庫更友好,所以我認爲它希望在更多版本中表現更好。 –

相關問題