SQL Pivot多行... CONFUSED?

时间:2010-12-06 14:55:00

标签: sql tsql pivot pivot-table

好的,我有一段时间没有做过SQL。这是我必须得到的最深入的。基本上我有一个转动表,然后根据日期分解它。

现在我有一个经历的交易。有3种交易类型。让我们说交付,运送,返回。所以我的表有一个交易ID,交易日期和交易类型。我需要对此进行透视并计算然后对事务类型求和。到目前为止我有这个代码:

SELECT
    SUM(Delivered),
    SUM(Shipped),
    SUM(Returned),
    TransactionID,
    TransactionDate
FROM
    (
        (SELECT
            TransactionID,
            TransactionDate,
            TransactionType
        FROM Transactions) AS Ttable
        PIVOT
        (
            COUNT(TransactionType)
            FOR TransactionTYpe IN
            (
                [Delivered],
                [Shipped],
                [Returned]
            )
         ) as Pvt1
    )

这获取每种交易类型的计数总和。但是,这为我提供了所有现有交易类型的总计。我需要在一段时间内完成所有这些工作。例如(我知道这将是很多变量,但它是我的应用程序可以做到的唯一方式),我需要找出每个月的2010年1月 - 2012年12月所有交易类型的总和。所以12x3。我怎么能这样打破这个?请帮忙!疯了!

1 个答案:

答案 0 :(得分:1)

这是一个起点:

SELECT TransactionMonth, [Delivered], [Shipped], [Returned] 
 from (select
          TransactionType
         ,cast(datename(mm, TransactionDate) + ' 1,  ' + datename(yy, TransactionDate) as smalldatetime) TransactionMonth
        from Transactions) ByMonth
 pivot (count(ByMonth.TransactionType)
        for ByMonth.TransactionType in ([Delivered],[Shipped],[Returned] )
        ) xx
 order by TransactionMonth

目前还不完全清楚源数据是什么样的,或者你的最终网格应该是什么,所以我做了一些假设:

  • 我假设每个TransactionId在一个日期有一个交易。我将其从最终查询中分解出来,并按日历月生成总计
  • 我返回表格中每个条目的结果。将带有适当日期过滤参数的where子句添加到SELECT子句中以获得更少。
  • 必须有一个更好的方法将日期时间“清理”为“年月”形式,如果找到它就使用它
  • 我在自己的同桌上测试了这个,然后转换成了你的名字 - 很确定我没问题,但是一些错别字可能已经插入。(我使用的是SQL 2005。)