如何编写一个实现Excel SUMIFS函数的SQL查询

我有这样一张桌子:

Date Sales Department Store 02/01/2012 4.09 Toys A 03/01/2012 5.90 Toys A 02/01/2012 6.64 Toys B 03/01/2012 4.71 Toys B 02/01/2012 16.72 Toys C 03/01/2012 1.37 Toys C 02/01/2012 13.22 Movies A 03/01/2012 18.06 Movies A 02/01/2012 5.97 Movies B 03/01/2012 16.71 Movies B 02/01/2012 15.38 Movies C 03/01/2012 19.75 Movies C 

想要这样一个表,只有商店A和B被考虑:

 Date Toys Movies 02/01/2012 10.73 19.19 03/01/2012 10.61 34.77 

这里我们将在EXCEL中使用SUMIFS函数:

 =SUMIFS(Value;Date;$H4;Department;I$3;Store;"<>C") 

我们可以在SQL中写什么?

考虑到这是一个很短的例子,数据库表有30多个部门和更多的date。 我正在使用脚本

 SELECT DISTINCT Date, ISNULL(MAX(CASE WHEN Department = 'Toys' AND Store = 'A' THEN Sales END),0) + ISNULL(MAX(CASE WHEN Department = 'Toys' AND Store = 'B' THEN Sales END),0) [Toys], ISNULL(MAX(CASE WHEN Department = 'Movies' AND Store = 'A' THEN Sales END),0) + ISNULL(MAX(CASE WHEN Department = 'Movies' AND Store = 'B' THEN Sales END),0) [Movies] FROM Table$ GROUP BY Date ORDER BY Date 

…但效率不高。 感谢您的任何提示。

您的查询是可以的,但可以改进一点:

 SELEC Date, MAX(CASE WHEN Department = 'Toys' THEN Sales else 0 END) as [Toys], MAX(CASE WHEN Department = 'Movies' THEN Sales else 0 END) as [Movies] FROM Table$ WHERE store in ('A', 'B') GROUP BY Date ORDER BY Date; 

这删除了distinct ,这是一个group by不必要group by 。 它将store上的条件移到where子句,因为它适用于所有行。 而且,它通过在case语句中包含else 0来移除ISNULL() ,所以在部门中没有销售的存储将返回0而不是NULL