Совет SQL - агрегирование данных для конкретных случаев - PullRequest
1 голос
/ 11 августа 2011

По сути, мне нужно сгруппировать уникальные данные о продукте в одну строку, когда:

  • Поставщик соответствует
  • Цена на товары соответствует (или) 1 из товарных линийравно '0,00'

Вот пример набора данных вместе с рабочим запросом для того, что я пытаюсь выполнить.Мне просто не совсем удобно, что это лучший способ выполнить этот запрос.

DECLARE @Test TABLE
(
SupplierSKU VARCHAR(25),
Description VARCHAR(50),
Quantity VARCHAR(25),
Price VARCHAR(25)
)

INSERT INTO @Test
SELECT '123', 'APPLES', '15', '0.00'
INSERT INTO @Test
SELECT '124', 'ORANGES', '10', '15.34'
INSERT INTO @Test
SELECT '123', 'APPLES', '5', '27.40'
INSERT INTO @Test
SELECT '125', 'PLUMS', '67', '34.86'
INSERT INTO @Test
SELECT '124', 'ORANGES', '10', '15.78'
INSERT INTO @Test
SELECT '125', 'PLUMS', '3', '34.86'


SELECT SupplierSKU, Description, SUM(Quantity) AS [Quantity], MAX(Price) AS [Price]
FROM
(
    SELECT SupplierSKU, Description, SUM(CAST(Quantity AS INT)) AS [Quantity], (SELECT MAX(CAST(Price AS MONEY)) AS [Price] FROM @Test ti WHERE ti.SupplierSKU = t.SupplierSKU AND ti.Price = t.price AND ti.Price <> '0.00') AS [Price]
    FROM @Test t
    GROUP BY SupplierSKU, Description, Price
) pdata
GROUP BY pdata.SupplierSKU, pdata.Description

Желаемые результаты:

SupplierSKU Description Quantity    Price 
123         APPLES          20      27.40 
124         ORANGES         10      15.34
124         ORANGES         10      15.78  
125         PLUMS           70      34.86

Ответы [ 3 ]

2 голосов
/ 11 августа 2011

Это должно привести к «желаемому выводу», но желаемый вывод не соответствует текстовой цели.Почему количество и цена varchar.Это решение предполагает преобразование количества в целое число в таблице SQL.

    SELECT SupplierSKU, Description, SUM(Quantity), P AS [Price]
    FROM @test 
    Where [Price] > 0 
    GROUP BY SupplierSKU, Description, Price
1 голос
/ 11 августа 2011

Сначала я починил ваше собственное решение

SELECT SupplierSKU, Description, SUM(Quantity) AS [Quantity], MAX(cast(Price as money)) AS [Price] 
FROM 
( 
    SELECT SupplierSKU, Description, SUM(CAST(Quantity AS INT)) AS [Quantity], 
    (SELECT MAX(cast(PRICE as money)) from @test 
    where t.SupplierSKU = SupplierSKU and Description = t.Description and (t.price = '0.00' or t.price = price)) price
    FROM @Test t 
    GROUP BY SupplierSKU, Description , price
) pdata 
GROUP BY pdata.SupplierSKU, pdata.Description , price

Тогда я переписал ваше решение на что-то более читабельное

SELECT suppliersku, description, sum(cast(quantity as int)) quantity, max(cast(price as money)) price FROM (
SELECT suppliersku, description, quantity, price FROM @test
WHERE price <> '0.00'
UNION ALL 
SELECT t1.suppliersku, t1.description, t1.quantity, max(t2.price)
FROM @test t1
join
@test t2 ON t1.SupplierSKU=t2.SupplierSKU and t1.Description = t2.Description
WHERE t1.price = '0.00'
GROUP BY t1.suppliersku, t1.description, t1.quantity
) a
GROUP BY suppliersku, description, price

Вы можете заметить, что я получаю правильное количество яблок (15 + 5 = 20)

0 голосов
/ 11 августа 2011
SELECT SupplierSKU, Description, SUM(Quantity) AS Qte, SUM(Price) AS Total
FROM @test t
GROUP BY SupplierSKU, Description
ORDER BY SupplierSKU

Это дает тебе то, что ты хочешь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...