SQL суммирование столбца на основе другого столбца - PullRequest
0 голосов
/ 05 февраля 2019

Итак, у меня есть стол с кучей заказов.Каждый заказ имеет номер заказа на покупку (5-й столбец).Моя таблица содержит все строковые значения каждого номера заказа.Например, заказ 3130148 имеет 5 позиций, которые были заказаны, поэтому он имеет 5 строк.

Company_Code    Division_Code   Date_Entered    Customer_Number Customer_Purchase_Order_Number  Item_Number Color_Code  Quantity_Ordered    Description Ship_Via_Code   Order_Value Order_Status    Line_Status Price

3   1   00:00.0 ECOM2X      3130183 3102043203L     41420   1   COTTON 4PK BIKINI BRIEF SGRD    0   30  80  12
3   1   00:00.0 ECOM2X      3130183 3102132003S     2221    1   STRETCH 3PK NO SHOW BRIEF   SGRD    0   30  80  39
3   1   00:00.0 ECOM2X      3130148 3102012503L     46135   1   COTTON 1PK LONG SLEEVE HENLEY   SGRD    58  45  70  9
3   1   00:00.0 ECOM2X      3130148 3102012503L     60120   1   COTTON 1PK LONG SLEEVE HENLEY   SGRD    58  45  70  9
3   1   00:00.0 ECOM2X      3130148 3104312001L     40136   1   43100 GRAPHIC COTTON NO-SHOW BREIF  SGRD    58  45  80  9.6
3   1   00:00.0 ECOM2X      3130148 3104832001L     46263   1   STRETCH M&M NO SHOW BRIEF   SGRD    58  45  70  20
3   1   00:00.0 ECOM2X      3130148 3104832001L     55112   1   STRETCH M&M NO SHOW BRIEF   SGRD    58  45  70  20
3   1   48:28.1 ECOM2X      3130143 3104235901S     69615   1   SLIQ MICRO SLIQ BRIEF   SGRD    60  45  70  9
3   1   48:28.1 ECOM2X      3130143 3104235901S     90502   1   SLIQ MICRO SLIQ BRIEF   SGRD    60  45  70  9
3   1   48:28.1 ECOM2X      3130143 3104234301S     90702   1   SLIQ MICRO SLIQ TRUNK   SGRD    60  45  70  9

Сейчас я пытаюсь подсчитать итоги.Как и общее количество заказанных товаров, общее количество использованных кодов доставки и т. Д. У меня возникла проблема с общей стоимостью всех заказов.В моей таблице есть столбец значения заказа.Однако, поскольку таблица разделена по каждой позиции, я не могу просто суммировать весь столбец Order_Value, так как есть много дубликатов (по одному на каждую строку).Поэтому мне нужно сложить все значения заказа, если номер заказа на покупку отличается.

Это строка кода, которую я использовал, но она не работает

Sum(Order_ValueG) FROM (SELECT MAX(Order_Value) AS Order_ValueG FROM T GROUP BY Customer_Purchase_Order_Number) T2 --AS Total_Orders_Value   

Я нашел этот код здесь -> SUM (DISTINCT) на основе других столбцов

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

Вот полный код (я выбираю все после оператора begin и запускаю его)

ALTER Procedure [dbo].[Z_N_ECOM_ORDER_STATUS_ORDERTOTAL]

@CompanyCode    VARCHAR(5),
@DivisionCode   VARCHAR(5),
@FromDate       DATETIME,
@ToDate         DATETIME
AS

DECLARE @LocalCompanyCode VARCHAR(5)
SET @LocalCompanyCode = @CompanyCode

DECLARE @LocalDivisionCode VARCHAR(5)
SET @LocalDivisionCode = @DivisionCode

DECLARE @LocalFromDate DATETIME
SET @LocalFromDate = @FromDate

DECLARE @LocalToDate DATETIME
SET @LocalToDate = @ToDate

BEGIN

    SET NOCOUNT ON;

    DECLARE @LocalCompanyCode VARCHAR(5)
    SET @LocalCompanyCode = '03'
    DECLARE @LocalDivisionCode VARCHAR(5)
    SET @LocalDivisionCode = '001'
    DECLARE @LocalFromDate DATETIME
    SET @LocalFromDate = '1/25/2019'
    DECLARE @LocalToDate DATETIME
    SET @LocalToDate = '1/30/2019'

    SELECT DISTINCT 
    T.Item_Number 
    ,T.Description
    ,Sum(T.Quantity_Ordered) OVER (PARTITION BY T.Item_Number) as Total_Items_Ordered_Number
    ,T.color_code
    ,Sum(T.Quantity_Ordered) OVER (PARTITION BY T.Item_Number, T.Color_Code) as Total_Items_Ordered_NumberColor

    ,DENSE_RANK() OVER (PARTITION BY T.Ship_Via_Code ORDER BY T.Customer_Purchase_Order_Number ASC) 
        + DENSE_RANK() OVER (PARTITION BY T.Ship_Via_Code ORDER BY T.Customer_Purchase_Order_Number DESC) 
            - 1 AS ShipCode

    ,DENSE_RANK() OVER (PARTITION BY T.Company_Code ORDER BY T.Customer_Purchase_Order_Number ASC) 
        + DENSE_RANK() OVER (PARTITION BY T.Company_Code ORDER BY T.Customer_Purchase_Order_Number DESC) 
             AS Total_Orders_Count

    ,Sum(Order_ValueG) FROM (SELECT MAX(Order_Value) AS Order_ValueG FROM T GROUP BY Customer_Purchase_Order_Number) T2 --AS Total_Orders_Value   

    /*,Sum(T.Price) OVER (PARTITION BY T.Company_Code) as Price
    ,Sum(T.Discount_Value) OVER (PARTITION BY T.Company_Code) as Discount_Value
    ,Sum(T.Freight_Charges) OVER (PARTITION BY T.Company_Code) as Freight_Charges
    ,Sum(T.Tax_Value) OVER (PARTITION BY T.Company_Code) as Tax_Value*/ 

    FROM(

        /*DECLARE @LocalCompanyCode VARCHAR(5)
        SET @LocalCompanyCode = '03'
        DECLARE @LocalDivisionCode VARCHAR(5)
        SET @LocalDivisionCode = '001'
        DECLARE @LocalFromDate DATETIME
        SET @LocalFromDate = '1/25/2019'
        DECLARE @LocalToDate DATETIME
        SET @LocalToDate = '1/30/2019'*/

        SELECT
         O.Company_Code
        ,O.Division_Code
        ,O.Date_Entered
        ,O.Customer_Number
        ,O.Customer_Purchase_Order_Number
        ,OD.Item_Number
        ,OD.Color_Code
        ,OD.Quantity_Ordered
        ,S.Description
        ,O.Ship_Via_Code --calculate count of each code
        ,O.Order_Value -- calculate how much money made from all orders (should match sum of all money made per item)
        ,O.Order_Status --calculate how many orders were cancelled (30)
        ,OD.Line_Status --calculate how many items were cancelled (80)
        ,OD.Price -- calculate how much money made per item
        ,OD.Discount_Value
        ,OD.Discount_Percentage
        ,OD.Tax_Value
        ,OD.Tax_Percentage
        ,OD.Freight_Charges
        ,OD.Freight_Percentage

        FROM 

        [JMNYC-AMTDB].[AMTPLUS].[dbo].Orders O (nolock)

        LEFT JOIN 
        [JMNYC-AMTDB].[AMTPLUS].[dbo].Order_Detail OD (nolock) On O.Company_Code =
            OD.Company_Code And O.Division_Code =
            OD.Division_Code And O.Control_Number =
            OD.Control_Number

        LEFT JOIN
        [JMNYC-AMTDB].[AMTPLUS].[dbo].Style S (nolock) On OD.Company_Code = S.Company_Code And
            OD.Division_Code = S.Division_Code And
            OD.Item_Number = S.Item_Number And
            OD.Color_Code = S.Color_Code

        WHERE 
        (O.Company_Code = @LocalCompanyCode OR @LocalCompanyCode IS NULL) AND 
        (O.Division_Code = @LocalDivisionCode OR @LocalDivisionCode IS NULL) AND
        o.Customer_Number = 'ecom2x' AND 
        o.Customer_Purchase_Order_Number not like '%bulk%' AND
        o.Date_Entered BETWEEN @LocalFromDate AND DATEADD(dayofyear, 1, @LocalToDate)

        --order by date_entered desc
        --order by Customer_Purchase_Order_Number desc

        ) AS T 

    ORDER BY Total_Items_Ordered_Number desc, Total_Items_Ordered_NumberColor desc

END

Я думаю, что ошибка связана со мной, пытающимся использовать Таблицу T в моем подзапросе,Если бы это был простой запрос, я бы просто GROUP BY Customer_Purchase_Order_Number, но так как я выбираю несколько вещей, это не работает.

1 Ответ

0 голосов
/ 06 февраля 2019

Хорошо, код, который вы опубликовали, слишком взломан, чтобы быть полезным, и вы не поделились своим DDL или необработанными данными, поэтому я собираюсь дать вам некоторое указание в коде psuedo.

Поэтому мне нужно сложить все значения заказа, если номер заказа на покупку отличается.

Вы можете сделать что-то вроде:

SUM(CASE
  WHEN ROW_NUMBER() OVER (PARTITION BY PurchaseOrderNumber ORDER BY SomeColumn)=1 THEN OrderValue
  ELSE 0
END) AS SumValues
...