它可以使用單個查詢來實現與任何一個子選擇(與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
你」 d需要一個數據透視查詢,因爲您正在嘗試將列值轉換爲行。 –