Суммируйте значения нескольких строк в новый столбец - PullRequest
1 голос
/ 15 апреля 2019

У меня есть хранимая процедура, возвращающая таблицу, которая выглядит следующим образом:

ID | Type | Price | Description
-------------------------------
2  | J    | 40.00 | Job
2  | F    | 10.00 | Freight
2  | P    | 20.00 | Postage
2  | F    |  5.00 | Handling
7  | J    | 50.00 | Job
7  | F    | 20.00 | Freight
7  | P    | 30.00 | Postage
7  | H    |  5.00 | Handling

Я хотел бы, чтобы она возвращала таблицу следующим образом:

ID | Type | Price | Description | FreightPrice
-----------------------------------------
2  | J    | 40.00 | Job         | 15.00
2  | F    | 10.00 | Freight     | 15.00    
2  | P    | 20.00 | Postage     | 15.00
2  | F    |  5.00 | Freight     | 15.00
7  | J    | 50.00 | Job         | 20.00
7  | F    | 20.00 | Freight     | 20.00
7  | P    | 30.00 | Postage     | 20.00
7  | H    |  5.00 | Handling    | 20.00

Предполагаемый результат будет суммироватьсяобщая стоимость фрахта каждого уникального идентификатора в его собственном столбце, т. е. итого ID FreightPrice, будет составлять $ 15,00.

Я попытался использовать следующее для получения этого результата

FreightPrice = (SELECT SUM(Price) 
                FROM Table
                WHERE Type = 'F' AND ID >= 2 AND ID <= 7)

Проблема с этимзаключается в том, что он возвращает FreightPrice в размере 35,00 долл. США, потому что он суммирует все экземпляры типа 'F'.

Нужно ли разделить их на два разных подзапроса или кто-нибудь знает способ достижения этого с помощью одного подзапроса?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2019

Вы, кажется, хотите функцию окна:

select t.*,
       sum(case when description = 'freight' then price end) over (partition by id) as freightprice
from t;
2 голосов
/ 15 апреля 2019

Оконная функция - лучший подход, но вы также можете попробовать следующее:

Введите:

CREATE TABLE #Data (
   ID int,
   [Type] varchar(1),
   Price numeric(10, 2),
   Description varchar(50)
)
INSERT INTO #Data
   (ID, [Type], Price, Description)
VALUES   
   (2, 'J', 40.00, 'Job'),
   (2, 'F', 10.00, 'Freight'),
   (2, 'P', 20.00, 'Postage'),
   (2, 'F',  5.00, 'Handling'),
   (7, 'J', 50.00, 'Job'),
   (7, 'F', 20.00, 'Freight'),
   (7, 'P', 30.00, 'Postage'),
   (7, 'H',  5.00, 'Handling')

Заявление:

SELECT t.*, s.*
FROM #Data t
LEFT JOIN (
   SELECT ID, SUM(Price) AS FreightPrice 
   FROM #Data 
   WHERE [Type] = 'F' 
   GROUP BY [ID]
) s ON (t.ID = s.ID)

Выход:

ID  Type    Price   Description ID  FreightPrice
2   J       40.00   Job         2   15.00
2   F       10.00   Freight     2   15.00
2   P       20.00   Postage     2   15.00
2   F       5.00    Handling    2   15.00
7   J       50.00   Job         7   20.00
7   F       20.00   Freight     7   20.00
7   P       30.00   Postage     7   20.00
7   H       5.00    Handling    7   20.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...