2015-12-10 73 views
0

我已經定義,像這樣的表:在範圍Postgres的總結日期

CREATE TABLE Items (
    Barcode  CHAR(50) PRIMARY KEY NOT NULL 
    Location CHAR(15) , 
    ManufacturedAt TIMESTAMP WITH TIMEZONE, 
    ShippedOutAt TIMESTAMP WITH TIMEZONE, 
    ReceivedAt TIMESTAMP WITH TIMEZONE, 
    SoldAt  TIMESTAMP WITH TIMEZONE, 
    DiscardedAt TIMESTAMP WITH TIMEZONE, 
); 

我想在過去的十二個月獲得每個日期字段的位置的總和。 因此例如導致我試圖得到:

Date NumManu NumShip NumRece NumSold NumDisc 
DEC 5  3  3  2  1 
NOV 3  5  5  3  2 

我以任何方式沒有SQL專家,但我不確定如何做到這一點沒有做12個不同的SQL查詢(每月一),或者是唯一的方法?提前致謝!

+0

你」 d需要一個數據透視查詢,因爲您正在嘗試將列值轉換爲行。 –

回答

0

它可以使用單個查詢來實現與任何一個子選擇(與set-returning functions):

SELECT lo, hi, to_char(lo, 'MON') Date, 
     (SELECT count(*) FROM Items WHERE ManufacturedAt BETWEEN lo AND hi) NumManu, 
     (SELECT count(*) FROM Items WHERE ShippedOutAt BETWEEN lo AND hi) NumShip, 
     (SELECT count(*) FROM Items WHERE ReceivedAt  BETWEEN lo AND hi) NumRece, 
     (SELECT count(*) FROM Items WHERE SoldAt   BETWEEN lo AND hi) NumSold, 
     (SELECT count(*) FROM Items WHERE DiscardedAt BETWEEN lo AND hi) NumDisc 
FROM generate_series(current_timestamp, current_timestamp - interval '11 mon', interval '-1 mon') ts, 
LATERAL (select date_trunc('month', ts)) lo(lo), 
LATERAL (select lo + interval '1 mon') hi(hi) 

...或多個連接在同一個表的:

SELECT lo, hi, to_char(lo, 'MON') Date, 
      count(DISTINCT JManu) NumManu, 
      count(DISTINCT JShip) NumShip, 
      count(DISTINCT JRece) NumRece, 
      count(DISTINCT JSold) NumSold, 
      count(DISTINCT JDisc) NumDisc 
FROM  generate_series(current_timestamp, current_timestamp - interval '11 mon', interval '-1 mon') ts, 
LATERAL (select date_trunc('month', ts)) lo(lo), 
LATERAL (select lo + interval '1 mon') hi(hi) 
LEFT JOIN Items JManu ON JManu.ManufacturedAt BETWEEN lo AND hi 
LEFT JOIN Items JShip ON JShip.ShippedOutAt BETWEEN lo AND hi 
LEFT JOIN Items JRece ON JRece.ReceivedAt  BETWEEN lo AND hi 
LEFT JOIN Items JSold ON JSold.SoldAt   BETWEEN lo AND hi 
LEFT JOIN Items JDisc ON JDisc.DiscardedAt BETWEEN lo AND hi 
GROUP BY lo, hi 
+0

這太棒了!正是我在找什麼!如果可能,我儘量避免多次往返數據庫,並且我每天都會學習更多關於SQL的知識! – comwizz2

0

我可能會遺漏一些東西,但好像你可以只使用COUNT,然後是ORDER BY或GROUP BY月份。

雖然我現在看到你只是將月份記錄爲實際日期,所以你將不得不執行某種邏輯檢查來獲取每月開始和結束之間的日期。

我相信如果是這樣的話,你將不得不手動在where子句中每個月進行一次計數。