【问题标题】:SQL - Group By Into Separate ColumnsSQL - 分组到单独的列
【发布时间】:2013-05-01 23:37:59
【问题描述】:

使用 SQL Server 2008 R2。我不确定这是否可行,但我想按两列分组,并将它们的差异放入新列中。用一个例子可能更容易解释:

前:: [日期] [ID] [AMT] [类型] 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 2 20 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 10 21 2013-01-11 44​​34E2D5-1D08-45FA-AADF-F653BF9A0D97 4 20 2013-01-11 44​​34E2D5-1D08-45FA-AADF-F653BF9A0D97 4 21 后:: [日期] [ID] [AMT 20] [AMT 21] 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 2 10 2013-01-11 44​​34E2D5-1D08-45FA-AADF-F653BF9A0D97 4 4

这是我目前的 SQL:

SELECT 
    CAST(TransDate AS DATE) AS [TransDate],ItemID,COUNT(TransactionTypeID) AS [TransAmt], TransactionTypeID
FROM 
    Transactions
WHERE 
    TransDate BETWEEN '2013-01-01 10:00:00' AND '2013-02-01 10:00:00'
    AND TransactionTypeID IN (20,21)
GROUP BY
    CAST(TransDate AS DATE),ItemID,TransactionTypeID

感谢任何帮助,谢谢!

【问题讨论】:

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:

您可以使用带有 CASE 的聚合函数将行转换为列:

SELECT CAST(TransDate AS DATE) AS [TransDate],
  ItemID,
  count(case when TransactionTypeID=20 then TransactionTypeID end) Amt_20,
  count(case when TransactionTypeID=21 then TransactionTypeID end) Amt_21
FROM Transactions
WHERE 
    TransDate BETWEEN '2013-01-01 10:00:00' AND '2013-02-01 10:00:00'
    AND TransactionTypeID IN (20,21)
GROUP BY CAST(TransDate AS DATE),ItemID;

由于您使用的是 SQL Server,因此也可以使用 PIVOT 函数编写:

select TransDate,
  ItemId,
  [20] as Amt_20,
  [21] as Amt_21
FROM
(
  SELECT CAST(TransDate AS DATE) AS [TransDate],
    ItemID,
    TransactionTypeID
  FROM Transactions
  WHERE TransDate BETWEEN '2013-01-01 10:00:00' AND '2013-02-01 10:00:00'
    AND TransactionTypeID IN (20,21)
) d
pivot
(
  count(TransactionTypeID)
  for TransactionTypeID in ([20], [21])
) piv

【讨论】:

  • 从来不知道 Pivot 功能。效果很好,谢谢!
【解决方案2】:

bluefeet answer 可能是最好的方法,但如果您的查询变得更复杂,您可以随时使用尽可能多的 UNIONS :)

    SELECT 
        CAST(TransDate AS DATE) AS [TransDate],ItemID,COUNT(TransactionTypeID) AS [TransAmt], TransactionTypeID
    FROM 
        Transactions
    WHERE 
        TransDate BETWEEN '2013-01-01 10:00:00' AND '2013-02-01 10:00:00'
        AND TransactionTypeID IN (20)
    GROUP BY
        CAST(TransDate AS DATE),ItemID,TransactionTypeID
UNION
SELECT 
    CAST(TransDate AS DATE) AS [TransDate],ItemID,COUNT(TransactionTypeID) AS [TransAmt], TransactionTypeID
FROM 
    Transactions
WHERE 
    TransDate BETWEEN '2013-01-01 10:00:00' AND '2013-02-01 10:00:00'
    AND TransactionTypeID IN (21)
GROUP BY
    CAST(TransDate AS DATE),ItemID,TransactionTypeID

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2016-01-11
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多