SQL 按日期汇总列中的值

SQL Aggregate value in column datewise

下面是我的数据库值。

我正在按日期查找 header 列中的值总和,并且我有 MS Access 数据库。谁能帮我建立 SQL 查询? 请找到以下预期输出。

如果您知道一组日期,则可以使用条件聚合。在 MS Access 中,这使用 iif() 函数。您的日期看起来像字符串,所以:

select a, b, c, d,
       sum(iif(store_date = '17-09-2016', val, 0)) as [17-09-2016],
       sum(iif(store_date = '18-09-2016', val, 0)) as [18-09-2016],
       sum(iif(store_date = '19-09-2016', val, 0)) as [19-09-2016],
       sum(iif(store_date = '20-09-2016', val, 0)) as [20-09-2016]
From t
Group by a, b, c, d;

您应该使用内置日期数据类型将日期存储在数据库中。但是,如果您必须将它们存储为字符串,我强烈建议您使用 ISO 标准 YYYY-MM-DD 格式。这很有用,因为您可以使用它进行排序和范围比较。

如果日期可能有数百个,条件聚合枢轴不可行,请考虑 crosstab query,Jet/ACE [=20= 中可用的唯一 SQL 操作] 方言(不在其他 RDMS 中)。

TRANSFORM SUM(t.val) AS SumOfVal
SELECT t.A, t.B, t.C, t.D
FROM MyTable t
GROUP BY t.A, t.B, t.C, t.D
PIVOT t.Store_date;

请注意:任何 Access table/query 中都有 255 列的限制。因此,如果您的 table 产生 250 多个唯一日期,您将不得不拆分成多个交叉表。您可以使用 PIVOT ... IN 子句相应地过滤日期:

TRANSFORM SUM(t.val) AS SumOfVal
SELECT t.A, t.B, t.C, t.D
FROM MyTable t
GROUP BY t.A, t.B, t.C, t.D
PIVOT t.Store_date IN ('17-09-2016', '18-09-2016', '20-09-2016');