【发布时间】:2014-04-12 06:11:05
【问题描述】:
我正在尝试创建一个查询,该查询将在三个时间段内输出客户的购买情况。第一个是 10/01/2010 到 09/31/2011,第二个是 10/01/2011 到 09/31/2012,依此类推。
以下查询返回我想要的数据,但我希望每个日期期间的购买位于同一输出中的单独列中。我可以将每个查询的结果放入 Excel 并在 CUST_NO 上执行 VLOOKUP 以合并数据,但我确信有一个更优雅的解决方案。
2010 年查询:
SELECT STR_ID, CUST_NO, SUM(TOT) AS Expr2010
FROM PS_TKT_HIST
WHERE (BUS_DAT BETWEEN CONVERT(DATETIME, '2010-10-01 00:00:00', 102) AND CONVERT(DATETIME, '2011-09-31 00:00:00', 102))
GROUP BY STR_ID, CUST_NO
2011 年查询
SELECT STR_ID, CUST_NO, SUM(TOT) AS Expr2011
FROM PS_TKT_HIST
WHERE (BUS_DAT BETWEEN CONVERT(DATETIME, '2011-10-01 00:00:00', 102) AND CONVERT(DATETIME, '2012-09-31 00:00:00', 102))
GROUP BY STR_ID, CUST_NO
这给了我两个不同的结果。
如何将两个查询中的 WHERE 子句组合成一个查询,将结果生成到具有单独列(Expr2010、Expr2011 等)的单个集合中?
【问题讨论】:
-
您发布的查询不会产生两个单独的结果。它们是完全相同的结果,只是为 SUMmed 列提供了不同的列别名。我认为您在发布的 SQL 中犯了错误,或者您在 where 语句中犯了错误。 (它们在 WHERE 中都包含相同的确切日期时间值,因此它们将返回相同的值。)
-
您要执行的操作称为
Pivot。如果你谷歌,或者在这里寻找例子,那应该让你开始。如果您知道您只有 3 个静态日期范围,您还可以在三个单独的列中使用CASE WHEN,这将SUM满足条件的值。 -
@KenWhite 更正了第二个查询,谢谢。
-
@Adamwenger 谢谢亚当,我通过研究看到 CASE 可能是解决方案,但找不到适合我特定情况的好例子。将进一步调查。
标签: sql sql-server sql-server-2008-r2 pivot