lundi 27 juillet 2015

SQL not calculating TOTAL of selected columns

I need to calculate the total value of a specific range of product codes. The product codes I need the calculation done on are 5780 and everything under 5700.

To get the total value I need the total cost of those products as well as the yield.

Value = Pirce * Yield %

To calculate the yield I use the equation:

 CASE 
    WHEN [PC].[ProductCategoryCode] = 5870
            THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
    WHEN [PC].[ProductCategoryCode] = 5730
            THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
    WHEN [PC].[ProductCategoryCode] = 5990
            THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
    ELSE Sum([PL].[OriginalQuantity_Stk]) / @Credits
END

The price is already in the system so I don't need to calculate that.

I have tried several equations to calculate the total value but none of them return the desired amount.

I feel like it should be similar to this equation but this just displays the value for each row as opposed to one total value:

SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (
        PARTITION BY (
            CASE 
                WHEN PC.ProductCategoryCode = 5780
                    OR [PC].[ProductCategoryCode] < 5700
                    THEN PC.ProductCategoryCode
                END
            )
        ) * ICP.UnitCost

This equation displays one total sum but the total is incorrect:

CASE 
    WHEN [PC].[ProductCategoryCode] = 5780 OR [PC].[ProductCategoryCode] < 5700
        THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits * [ICP].[UnitCost]) OVER ()
END

I think that maybe I need the SUM of the UnitCost as well but when I try to do that inside the equation I get errors.

Sample Output:

    --------------------------------
    Product Category Code | Value  |
    ----------------------x--------x
    5870                  | 100    |
    5730                  | 400    |
    5990                  | 200    |
    5780                  | 200    |
    1111                  | 50     |  
    2222                  | 175    |  
    3333                  | 500    |  
    4444                  | 125    |  

Total Value: 1050 It has to ignore product code 5870, 5990, and 5730 and not include those in the total value.

I am using Microsoft SQL Sever 2005. Let me know if I need to explain further.

Full Code:

SET NOCOUNT ON;

DECLARE @Credits DECIMAL(19, 8);
DECLARE @Price DECIMAL(19, 8);

SET @Credits = 41000;
SET @Price = 1.57;

SELECT CASE 
        WHEN [PC].[ProductCategoryCode] = 5870
            THEN 'Trimmings'
        WHEN [PC].[ProductCategoryCode] = 5730
            THEN 'Rib Tips'
        WHEN [PC].[ProductCategoryCode] = 5990
            THEN 'Skins'
        ELSE [PC].[Description1]
        END AS [Description]
    ,SUM(SUM(PL.OriginalQuantity_Stk)) OVER (
        PARTITION BY (
            CASE 
                WHEN PC.ProductCategoryCode IN (
                        5870
                        ,5730
                        ,5990
                        )
                    THEN PC.ProductCategoryCode
                END
            )
        ) AS [Total Weight]
    ,Sum(CASE 
            WHEN [PC].[ProductCategoryCode] <> 5870
                THEN [PL].[OriginalQuantity_Stk]
            WHEN [PC].[ProductCategoryCode] <> 5730
                THEN [PL].[OriginalQuantity_Stk]
            WHEN [PC].[ProductCategoryCode] <> 5990
                THEN [PL].[OriginalQuantity_Stk]
            END) AS [Weight]
    ,@Credits - SUM(Sum([PL].[OriginalQuantity_Stk])) OVER () AS [Shrink]
    ,CASE 
        WHEN [PC].[ProductCategoryCode] = 5870
            THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        WHEN [PC].[ProductCategoryCode] = 5730
            THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        WHEN [PC].[ProductCategoryCode] = 5990
            THEN SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        ELSE Sum([PL].[OriginalQuantity_Stk]) / @Credits
        END AS [Yield]
    ,CASE 
        WHEN [PC].[ProductCategoryCode] = 5870
            THEN [ICP].[UnitCost]
        WHEN [PC].[ProductCategoryCode] = 5730
            THEN [ICP].[UnitCost] - 0.25
        WHEN [PC].[ProductCategoryCode] = 5990
            THEN [ICP].[UnitCost] * 0
        ELSE [ICP].[UnitCost]
        END AS [UC]
    ,CASE 
        WHEN [PC].[ProductCategoryCode] = 5870
            THEN [ICP].[UnitCost] * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        WHEN [PC].[ProductCategoryCode] = 5730
            THEN ([ICP].[UnitCost] - 0.25) * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        WHEN [PC].[ProductCategoryCode] = 5990
            THEN ([ICP].[UnitCost] * 0) * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        ELSE [ICP].[UnitCost] * SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (PARTITION BY [PC].[ProductCategoryCode])
        END AS [Value]
    ,SUM(Sum([PL].[OriginalQuantity_Stk]) / @Credits) OVER (
        PARTITION BY (
            CASE 
                WHEN PC.ProductCategoryCode = 5780
                    OR [PC].[ProductCategoryCode] < 5700
                    THEN PC.ProductCategoryCode
                END
            )
        ) * ICP.UnitCost AS [TotalValue]
FROM (
    (
        (
            (
                IC_Products [PC] INNER JOIN DC_Transactions [DCT] ON [PC].ProductKey = [DCT].ProductKey
                ) INNER JOIN AR_Customers [ARC] ON [DCT].CustomerKey = [ARC].CustomerKey
            ) INNER JOIN IC_ProductLots [PL] ON [DCT].LotKey = [PL].LotKey
        ) LEFT JOIN IC_ProductCosts [ICP] ON ICP.ProductKey = PC.ProductKey
        AND ICP.ProductCostCode = 5
    )
WHERE (
        [PL].ProductionDate >= { ts '2015-07-10 00:00:00' }
        AND (
            [PL].ProductionDate <= { ts '2015-07-10 00:00:00' }
            OR [PL].ProductionDate IS NULL
            )
        )
    AND (
        (1 = 1)
        AND [ARC].CustomerKey IN (39)
        )
GROUP BY CASE 
        WHEN [PC].[ProductCategoryCode] = 5870
            THEN 'Trimmings'
        WHEN [PC].[ProductCategoryCode] = 5730
            THEN 'Rib Tips'
        WHEN [PC].[ProductCategoryCode] = 5990
            THEN 'Skins'
        ELSE [PC].[Description1]
        END
    ,[ARC].CustomerKey
    ,[PC].ProductCategoryCode
    ,CASE 
        WHEN [PC].[ProductCategoryCode] = 5870
            THEN [ICP].[UnitCost]
        WHEN [PC].[ProductCategoryCode] = 5730
            THEN [ICP].[UnitCost] - 0.25
        WHEN [PC].[ProductCategoryCode] = 5990
            THEN [ICP].[UnitCost] * 0
        ELSE [ICP].[UnitCost]
        END
    ,[ICP].UnitCost
    ,[PC].ProcessCode
ORDER BY @Credits - SUM(Sum([PL].[OriginalQuantity_Stk])) OVER ()
    ,SUM(SUM(PL.OriginalQuantity_Stk)) OVER (
        PARTITION BY (
            CASE 
                WHEN PC.ProductCategoryCode IN (
                        5870
                        ,5730
                        ,5990
                        )
                    THEN PC.ProductCategoryCode
                END
            )
        )

Aucun commentaire:

Enregistrer un commentaire