Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-按分组到单独的列中_Sql_Sql Server_Sql Server 2008_Group By - Fatal编程技术网

SQL-按分组到单独的列中

SQL-按分组到单独的列中,sql,sql-server,sql-server-2008,group-by,Sql,Sql Server,Sql Server 2008,Group By,使用SQLServer2008R2。我不确定这是否可行,但我想按两列分组,将它们的差异放入新的列中。用一个例子来解释可能更容易: BEFORE:: [DATE] [ID] [AMT] [TYPE] 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 2 20 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 1

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

BEFORE:: [DATE] [ID] [AMT] [TYPE] 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 2 20 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 10 21 2013-01-11 4434E2D5-1D08-45FA-AADF-F653BF9A0D97 4 20 2013-01-11 4434E2D5-1D08-45FA-AADF-F653BF9A0D97 4 21 AFTER:: [DATE] [ID] [AMT 20] [AMT 21] 2013-01-11 36374DCD-47FE-48D8-8E70-8D3B37385311 2 10 2013-01-11 4434E2D5-1D08-45FA-AADF-F653BF9A0D97 4 4
感谢您的帮助,谢谢

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

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

bluefeet-answer可能是最好的方法,但是如果您的查询变得更复杂,您可以根据需要使用任意多的联合:)


看起来您正试图
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
    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