Sql 对范围内的日期进行求和

Sql 对范围内的日期进行求和,sql,postgresql,Sql,Postgresql,我有一个定义如下的表: 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, Sol

我有一个定义如下的表:

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,
);
我试图获得过去12个月内某个地点的每个日期字段的总和。 因此,我尝试获得的示例结果如下:

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

我无论如何都不是sql专家,但我不确定如何在不执行12个不同的sql查询(每个月一个)的情况下做到这一点,或者这是唯一的方法吗?提前谢谢

我可能遗漏了一些东西,但似乎您可以使用COUNT,然后使用ORDER BY或GROUP BY month

虽然我现在看到,您只将月份作为实际日期进行跟踪,所以您必须执行某种逻辑检查,以获得每个月的开始和结束之间的日期


如果是这种情况,我相信您必须在where子句中手动说明每个月的情况。

可以通过一个查询来完成,该查询可以使用以下任一子选项(和):

。。。或使用同一表的多个联接:

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

您需要一个pivot查询,因为您正在尝试将列值转换为行。这太棒了!正是我要找的!如果可能的话,我会尽量避免多次往返数据库,我每天都会学到更多关于SQL的知识!
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