Pergunta

Na minha SPROC uma tabela chamada # temp1 contém as seguintes colunas:

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

A minha pergunta é baseada na seguinte consulta

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)

Um conjunto de resultados de amostra esta aparência:

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

Infelizmente já que tenho que GROUP BY os QtyOnHand & ReservedQty colunas na minha declaração CASE eu recebo várias linhas para cada storeId.

Eu gostaria de saber se existe uma maneira simples para mim, para resumir os resultados (mais uma vez) com base na CommittedQty para que eu possa obter o seguinte conjunto de resultados que desejo:

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

Eu percebo que eu poderia usar outra tabela temporária, mas se perguntou se havia uma maneira mais fácil de conseguir isso dentro da instrução SELECT

Foi útil?

Solução

Eu não usaria uma tabela temporária. Meu palpite é que você já está usando pelo menos um demais:)

Você precisa colocar o SUM em torno de sua declaração CASE todo:

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

Outras dicas

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

As primeiras coisas primeiro: Se você pode evitar o uso de tabelas #temp e ## temporários, você deve. Eles são maus desagradáveis ??pequenas coisas que causam o aquecimento global e as inundações flash e são responsáveis ??por todos os tipos de emissões de estufa. (:

Gracejos à parte, a menos que seja absolutamente necessário, se livrar das tabelas temporárias e substituí-lo com uma consulta sub se você tiver que.

Você pode simplesmente embrulhar outra escolha em torno desta declaração

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top