2013-05-01 4 views
2

Использование SQL Server 2008 R2. Я не уверен, что это возможно, но я хотел бы сгруппировать по два столбца и принять их различия и поместить их в новые столбцы. Это, наверное, проще объяснить на примере:SQL - группа по отдельным столбцам

 
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 


Это 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 

Любая помощь приветствуется, спасибо!

+0

Похоже, вы пытаетесь «вывести» результат. http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx – Malk

ответ

0

Вы можете использовать агрегатную функцию с 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 
+0

Никогда не знал о функции Pivot. Это отлично поработало, спасибо! – Will

1

Ответ на bluefeet может быть лучшим способом сделать это, но если ваш запрос становится более сложным, вы всегда можете использовать столько 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 
Смежные вопросы