【问题标题】:Average, Total and Transpose平均、总计和转置
【发布时间】:2018-06-06 11:51:24
【问题描述】:

我在下面有这个查询:

SELECT distinct COUNT(Status) AS [Transactions], sender AS [Supplier],
left(DATENAME(mm, Date_Reported), 3) AS Month, DATENAME(yyyy, Date_Reported) AS Year
 FROM TX
 and Date_Reported >= DATEADD(MONTH, -13, CAST(GETDATE() AS DATE))
GROUP BY DATENAME(mm, Date_Reported), DATENAME(yyyy, Date_Reported), sender
ORDER BY sender, Year, Month DESC;

它给了我一个如下表:

TX | Supplier | Month | Year

现在上面可以有 X 行具有相同的供应商和与之关联的值,如下所示:

**TX | Supplier | Month | Year**
1  | A        | Oct   | 2017
5  | A        | Jan   | 2017
3  | A        | Mar   | 2018
2  | A        | Sep   | 2017

所有供应商都是这种情况,所以我想要一个简洁的表格,而不是一个包含许多行的冗长表格:

Supplier | May 17 | Jun 17 | Jul 17 ... | May 18 | 

我还想添加两个额外的列:过去 13 个月的平均值(即 5 月 17 日 - 5 月 18 日)以及过去 13 个月的总数,因此最终表格应如下所示:

Supplier | May 17 | Jun 17 | Jul 17 ... | May 18 | Average | Total

感谢我问了很多问题,但我希望有人可以帮助我完成一个可以完成上述所有操作的查询。

提前谢谢你:)

【问题讨论】:

  • 我会建议我总是用这样的东西做同样的事情,在你的表现层中做。尝试在您的 RDBMS 中使用 SQL 执行此类操作将需要动态 SQL,而且实现起来要困难得多。
  • 我很乐意,但我需要将此查询自动化到 ssrs Visual Studio 中,然后很难做到这一点
  • 有很多关于使用动态 SQL 创建 PIVOT 查询的示例
  • 如果是 SSRS,请使用矩阵而不是 tablix。容易得多。
  • @Larnu 我将如何处理我上面的第一个表?

标签: sql-server average transpose


【解决方案1】:

你必须这样做:

SELECT sender AS [Supplier],
   SUM(CASE WHEN MONTH(Date_Reported) = 5 AND YEAR(Date_Reported) = 2017  THEN 1 ELSE 0 END) AS [May 17],
   SUM(CASE WHEN MONTH(Date_Reported) = 6 AND YEAR(Date_Reported) = 2017  THEN 1 ELSE 0 END) AS [Jun 17]
GROUP BY sender
ORDER BY sender

【讨论】:

  • 有没有办法在不手动输入月份和年份的情况下进行?
  • 是的。取决于你想要什么。您可以轻松地连接一些东西,它会在日期之前返回固定的几个月。但是,如果您想要返回动态月数的东西,那么您将不得不使用动态 SQL(例如,使用循环生成包含 SQL 的字符串的 T-SQL 过程,类似于我的示例,然后您将使用 @987654322 调用@.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
相关资源
最近更新 更多