【问题标题】:SQL Pivot for multiple rows...CONFUSED?多行的 SQL Pivot... 困惑?
【发布时间】:2011-05-21 00:55:57
【问题描述】:

好的,我有一段时间没有做 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。我怎么能这样打破呢?请帮忙!快疯了!

【问题讨论】:

    标签: sql tsql pivot pivot-table


    【解决方案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。)

    【讨论】:

    • 问题是我需要这些列。因此,而不是由他们订购。我需要在 2010 年 1 月发货、交付、退货,然后在 2010 年 2 月发货、交付、退货。所有这些都需要订购。
    • 那么,每个年/月需要三列,每个事务1行? (如果你添加一个“最终结果应该像这样”的例子会有所帮助。)
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多