Столбец суммы SQL перед вставкой в ​​#temp - PullRequest
1 голос
/ 02 июня 2009

В моем SPROC таблица с именем # temp1 содержит следующие столбцы:

#temp1 (StoreId, StoreDesc, ReservedQty, AvgPrice, QtyOnHand)

Мой вопрос основан на следующем запросе

INSERT INTO #temp2 (StoreId, StoreDesc, CommittedQty)
(SELECT     StoreId,  StoreDesc, 
    CASE WHEN ReservedQty > QtyOnHand THEN
        sum(QtyOnHand * AvgPrice) 
    ELSE
        sum(ReservedQty * AvgPrice) 
    END AS CommittedQty
    FROM #temp1 
    GROUP BY StoreId, StoreDesc, QtyOnHand, ReservedQty)

Пример набора результатов выглядит следующим образом:

StoreId                 StoreDesc   CommittedQty    
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FramersBranch   0
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FarmersBranch   88978
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FarmersBranch   0
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FarmersBranch   3152
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA    Woodlands   5582
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA    Woodlands   389

К сожалению, так как я должен GROUP BY столбцы QtyOnHand & ReservedQty в моем операторе CASE, я получаю несколько строк для каждого StoreId.

Я хотел бы знать, есть ли для меня простой способ суммировать результаты (снова) на основе CommittedQty, чтобы я мог получить следующий набор результатов, который я желаю:

StoreId v               StoreDesc   CommittedQty    
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FramersBranch   92130
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA    Woodlands   5971

Я понимаю, что мог бы использовать другую временную таблицу, но подумал, есть ли более простой способ сделать это внутри оператора SELECT

Ответы [ 3 ]

2 голосов
/ 02 июня 2009
SELECT  StoreId,  StoreDesc, 
        SUM(
        CASE
        WHEN ReservedQty > QtyOnHand THEN
                QtyOnHand * AvgPrice 
        ELSE
                ReservedQty * AvgPrice
        END
        ) AS CommittedQty
FROM    #temp1 
GROUP BY
        StoreId, StoreDesc
1 голос
/ 02 июня 2009

Перво-наперво: если вы можете избежать использования таблиц #temp и ## temp, вам следует. Это злые, неприятные мелочи, которые вызывают глобальное потепление и внезапные наводнения и несут ответственность за все виды выбросов парниковых газов. (

Шутки, кроме случаев, когда это абсолютно необходимо, избавьтесь от временных таблиц и замените их подзапросом, если потребуется.

Вы можете просто обернуть другой выбор вокруг этого утверждения

INSERT INTO #temp2 (StoreId, StoreDesc, CommittedQty)
SELECT StoreId, StoreDesc, Sum (CommittedQty)
FROM 
(SELECT         StoreId,  StoreDesc, 
        CASE WHEN ReservedQty > QtyOnHand THEN
                sum(QtyOnHand * AvgPrice) 
        ELSE
                sum(ReservedQty * AvgPrice) 
        END AS CommittedQty
        FROM #temp1 
        GROUP BY StoreId, StoreDesc, QtyOnHand, ReservedQty)
)
GROUP BY StoreId, StoreDesc
1 голос
/ 02 июня 2009

Я бы не использовал временную таблицу. Я предполагаю, что вы уже используете хотя бы один слишком много:)

Вы должны поместить СУММУ вокруг всего вашего утверждения CASE:

SUM(AvgPrice *
     CASE
          WHEN ReservedQty > QtyOnHand THEN QtyOnHand
          ELSE ReservedQty
     END)
...