SQL СУММИРУЕТ одинаковые столбцы

#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]