У меня есть следующая таблица:

ID BuyOrSell Total
4    B         10
4    B         11
4    S         13
4    S         29
8    B         20
9    S         23

Я пытаюсь получить сумму столбцов B и S для каждого идентификатора, и если для идентификатора нет B или S, строка с 0, поэтому ожидаемый результат будет

ID BuyOrSell Total
4    B         21
4    S         42
8    B         20
8    S          0
9    S         23
9    B          0

Я пробовал это, и это вроде как то, что мне нужно, но не совсем:

DECLARE @Temp Table (ID int, BuyOrSell VARCHAR(1), charge Decimal)
INSERT INTO @Temp 
SELECT 4, 'B', 10 UNION ALL
SELECT 4, 'B', 11 UNION ALL
SELECT 4, 'S', 13 UNION ALL
SELECT 4, 'S', 29 UNION ALL
SELECT 8, 'B', 20 UNION ALL
SELECT 9, 'S', 23 

;With Results AS
(
SELECT ID,
       BuyOrSell,
       SUM(charge) AS TOTAL
FROM @Temp 
Group by ID, BuyOrSell
)
Select t.*,max(
                case when BuyOrSell = 'B' then 'Bfound' 
                end) over (partition by ID) as ref
            ,max(
                case when BuyOrSell = 'S' then 'Sfound' 
                end) over (partition by ID) as ref
FROM Results t;

Благодарность

4
03Usr 24 Окт 2014 в 12:17

3 ответа

Лучший ответ

Попробуй это:

;WITH CTE(ID, BuyOrSell) AS(
    SELECT 
        ID, T.BuyOrSell 
    FROM @Temp
    CROSS JOIN(
        SELECT 'B' UNION ALL SELECT 'S'
    )T(BuyOrSell)
    GROUP BY ID, T.BuyOrSell
)
SELECT
    C.ID,
    C.BuyOrSell,
    Total = ISNULL(SUM(T.charge), 0)
FROM CTE C
LEFT JOIN @Temp T
    ON T.ID = C.ID
    AND T.BuyOrSell = C.BuyOrSell
GROUP BY C.ID, C.BuyOrSell
ORDER BY C.ID, C.BuyOrSell
3
Felix Pamittan 24 Окт 2014 в 12:29
Нет проблем, рад, что смог помочь.
 – 
Felix Pamittan
24 Окт 2014 в 14:46

@ 03Usr, несмотря на то, что на ваш вопрос был дан ответ, попробуйте следующее:

         SELECT two.ID,
                two.BuyOrSell,
                ISNULL (one.Total, 0) Total
           FROM
        (SELECT ID,
                BuyOrSell,
                SUM (Total) Total
           FROM @Temp
       GROUP BY ID, BuyOrSell) one
LEFT OUTER JOIN
        (SELECT ID,
                BuyOrSell
           FROM @Temp
       GROUP BY ID,
                BuyOrSell) two
             ON one.ID = two.ID
            AND one.BuyOrSell = two.BuyOrSell;
0
tjeloep 29 Май 2015 в 13:05

Вот решение с хитрым соединением:

SELECT t1.ID, 
       v.l as BuyOrSell, 
       SUM(CASE WHEN t1.BuyOrSell = v.l THEN t1.charge ELSE 0 END) AS Total
FROM @Temp t1
JOIN (VALUES('B'),('S')) v(l) 
  ON t1.BuyOrSell = CASE WHEN EXISTS(SELECT * FROM @Temp t2 
                                     WHERE t2.ID = t1.ID AND t2.BuyOrSell <> t1.BuyOrSell) 
                         THEN v.l ELSE t1.BuyOrSell END
GROUP BY t1.ID, v.l
ORDER BY t1.ID, v.l

Выход:

ID  l   Total
4   B   21
4   S   42
8   B   20
8   S   0
9   B   0
9   S   23
0
Giorgi Nakeuri 29 Май 2015 в 14:01