2016-09-18 210 views
1

以下是我的数据库值。SQL日期列中的聚合值

db_values

我要寻找一个在列标题datewise值的总和,我有MS Access数据库。任何人都可以帮助我构建SQL查询? 请在下面找到预期的输出。

output

回答

2

如果你掌握设定的日期,那么你可以使用条件的聚集。在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格式。这很有用,因为您可以将它用于排序和范围比较。

+0

感谢您的时间和答复。这工作:) – Hemant

2

如果日期可能在数百个条件聚合数据透视不可行的情况下,请考虑crosstab query,这是在Jet/ACE SQL方言(不在其他RDMS中)中可用的唯一SQL操作。

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表/查询中都有255列的限制。因此,如果您的表格产生了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');