Суммируйте строки с одинаковым идентификационным номером и сортируйте по индивидуальному заказу - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть следующая структура таблицы для таблицы "продукты":

id    amount    number
1     10        M6545
2     32        M6424
3     32        M6545
4     49        M6412
...   ...       ...

Я хочу выбрать сумму сумм всех строк с одинаковым номером. Строки с одинаковым номером должны быть суммированы до одной суммы. Это значит:

M6545 -> Сумма 42

M6424 -> Сумма 32

M6421 -> Сумма 49

Мой запрос выглядит следующим образом и все еще не работает:

SELECT SUM(amount) as SumAm FROM products WHERE number IN ('M6412', 'M6545')

Я хочу найти способ, где я могу выбрать только сумму, упорядоченную по числам в выражении «IN». Это означает, что таблица результатов должна выглядеть следующим образом:

SumAm
49
42

Суммы не следует заказывать каким-либо образом. Он должен соответствовать порядку чисел в предложении IN.

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Нельзя упорядочить по результатам, основанным непосредственно на порядке предложения IN.
Что вы можете сделать, это что-то вроде этого:

SELECT SUM(amount) as SumAm 
FROM products 
WHERE number IN ('M6412', 'M6545')
GROUP BY number -- You must group by to get a row for each number
ORDER BY CASE number 
             WHEN 'M6412' THEN 1
             WHEN 'M6545' THEN 2
         END

Конечно, чем больше элементов в вашем предложении IN, тем более громоздким будет этот запрос. Поэтому может оказаться более практичным другое решение - присоединение к табличной переменной вместо использования IN:

DECLARE @Numbers AS TABLE 
(
    sort int identity(1,1), -- this will hold the order of the inserted values 
    number varchar(10) PRIMARY KEY -- enforce unique values
);

INSERT INTO @Numbers (number) VALUES
('M6412'), 
('M6545')

SELECT SUM(amount) as SumAm 
FROM products As p
JOIN numbers As n ON p.Number = n.Number
-- number and sort have a 1 - 1 relationship, 
-- so it's safe to group by it instead of by number
GROUP BY n.sort 
ORDER BY n.sort
0 голосов
/ 06 ноября 2018

использование group by число

SELECT number, SUM(amount) as SumAm FROM products     
--WHERE number IN ('M6412', 'M6545') i think you dont need where clause
group by number

Но если вы хотите только для 'M6412', 'M6545', тогда вам нужно условие where, которое вы показали во втором выходном примере

0 голосов
/ 06 ноября 2018

Ваше требование не имеет смысла ... Это не то, как IN предназначен для работы. Сказав это, следующее даст вам результат в нужном порядке:

SELECT SUM(amount)
FROM (VALUES
    ('M6545', 1),
    ('M6412', 2)
) AS va(number, sortorder)
INNER JOIN sumam ON va.number = sumam.number
GROUP BY va.number, va.sortorder
ORDER BY va.sortorder

Это несколько лучше, чем писать оператор CASE, когда вам нужно добавить условие WHEN для каждого числа.

0 голосов
/ 06 ноября 2018

Использование групп по и агрегация

SELECT SUM(amount) as SumAm FROM products
WHERE number IN ('M6412', 'M6545') 
group by number
...