#sql #sql-server
#sql #sql-сервер
Вопрос:
У меня есть таблица
CREATE TABLE [dbo].[StackOverflow]
(
[ArticleId] [bigint] NULL,
[Quantity] [decimal](18, 0) NULL,
[Type] [smallint] NULL
) ON [PRIMARY]
Внутри этой таблицы у меня есть некоторые результаты, которые выглядят следующим образом
ArticleId Quantity Type
------------- ------------ ------
10 50 1
12 20 1
10 10 1
10 18 1
12 5 2
17 14 2
10 30 2
- Тип 1 означает, что статья запланирована к производству
- Тип 2 означает, что статья завершена
Мне нужен выходной запрос, который показывает мне список всех статей
Вывод = запланирован — завершен
Пример: articleId: 10 Запланированное количество равно: 78 Завершенное количество равно:
30 Выход = 78 — 30 = 48
Мне действительно нечего показывать. Я знаю только, что мне нужно группировать по ArticleId
.
Я пробовал так
SELECT
articleid,
SUM(quantity) - (SELECT SUM(quantity)
FROM stackoverflow
WHERE type = 2
AND main.articleId = stackoverflow.articleId
GROUP BY articleid)
FROM
stackoverflow AS main
WHERE
type = 1
GROUP BY
articleid
Комментарии:
1. Определение вашей таблицы выглядит как SQL Server, поэтому я соответствующим образом изменил тег.
2. @MageeWorld просто нажмите редактировать
Ответ №1:
вы могли бы использовать case и sum
select ArticleId , sum( case type
when 1 then Quantity
when 2 then -Quantity
end) Output
from stackoverflow
group by ArticleId
Ответ №2:
Вам необходимо вычесть агрегированные суммы обоих типов:
SELECT
[ArticleId],
SUM(CASE WHEN [Type] = 1 THEN [Quantity] ELSE 0 END) - SUM(CASE WHEN [Type] = 2 THEN [Quantity] ELSE 0 END) AS [PlannedSubQuantityTotal]
FROM [dbo].[StackOverflow]
GROUP BY [ArticleId]
Или используйте «трюк» с суммированием, завершенным вместе с запланированным с -
префиксом:
SELECT
[ArticleId],
SUM(CASE WHEN [Type] = 1 THEN [Quantity] WHEN [Type] = 2 THEN -[Quantity] ELSE 0 END) AS [PlannedSubQuantityTotal]
FROM [dbo].[StackOverflow]
GROUP BY [ArticleId]