Комплексный SQL запрос - PullRequest
       22

Комплексный SQL запрос

0 голосов
/ 13 января 2020

В моей базе данных sql есть таблица с такой структурой

enter image description here

USE [XXXXX]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Sales](
    [Id] [uniqueidentifier] NOT NULL,
    [PoSId] [varchar](50) NOT NULL,
    [EditorCode] [varchar](10) NOT NULL,
    [ProductCode] [varchar](10) NOT NULL,
    [EditionCode] [varchar](10) NOT NULL,
    [IssueDate] [date] NOT NULL,
    [FeedbackType] [varchar](50) NOT NULL,
    [FeedbackRef] [varchar](50) NOT NULL,
    [Quantity] [int] NOT NULL,
    [CreationTime] [datetime] NOT NULL,
    [ModificationTime] [datetime] NOT NULL,
 CONSTRAINT [PK_Sales] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

FeedbackType "принимает 4 возможных значения:" ДОСТАВКА "," RESTOCKING "," MISSING "," UNSOLD

Я создал скрипт sql, который дает мне сумму недостающего количества для выделенного pointOfSale, productCode, editionCode и даты выпуска.

  SELECT [PoSId]
      ,[ProductCode]
      ,[EditionCode]
      ,[IssueDate]
      , CASE WHEN Quantity < 0 THEN Quantity * -1 ELSE Quantity END AS QuantityMissing
FROM (
SELECT [PoSId]
      ,[ProductCode]
      ,[EditionCode]
      ,[IssueDate]
      ,SUM([Quantity]) AS Quantity
  FROM [xxxxxxx].[dbo].[Sales]
  Where FeedbackType='MISSING' and IssueDate < '2019-12-18'
  AND CreationTime < '2019-12-19'
  GROUP BY [PoSId]
      ,[ProductCode]
      ,[EditionCode]
      ,[IssueDate]
  ) T

  ORDER by IssueDate

До сих пор скрипт делал то, что мне нужно (добавляя столбец для пропущенных количеств)

Теперь мне нужно изменить этот скрипт, чтобы сделать это:

1 - добавить новый столбец для суммы «непроданных» количеств с именем «Unsold_qty»

2 - добавьте еще один столбец для суммы «проданных» количеств с именем «Sold_qty», который рассчитывается по этой формуле => SOLD qty = DELIVERY Кол-во - НЕ УКАЗАН Кол-во - НЕ ПРОДАН Кол-во

Как мне изменить мой скрипт для создания этих двух новых столбцов?

Мне нужен примерно такой результат:

enter image description here

PS: не забывайте, что мое "где" состояние в этом сценарии учитываются только пропущенные количества (Where FeedbackType = 'MISSING') => чтобы делать то, что мне нужно сейчас, я полагаю, нам нужно изменить это условие «где» или, возможно, сделать другое условие «где» в другом месте.

Заранее благодарю за любую помощь!

1 Ответ

2 голосов
/ 13 января 2020

Это называется условной агрегацией.

Один из способов сделать это - поместить выражение CASE в SUM.

SELECT 
    [PoSId]
    ,[ProductCode]
    ,[EditionCode]
    ,[IssueDate]
    ,SUM(CASE WHEN FeedbackType='MISSING'  THEN [Quantity] ELSE 0 END) AS QuantityMissing
    ,SUM(CASE WHEN FeedbackType='UNSOLD'   THEN [Quantity] ELSE 0 END) AS QuantityUnsold
    ,SUM(CASE WHEN FeedbackType='DELIVERY' THEN [Quantity] ELSE 0 END) AS QuantityDelivery

    ,SUM(CASE WHEN FeedbackType='DELIVERY' THEN [Quantity] ELSE 0 END) 
    -SUM(CASE WHEN FeedbackType='MISSING'  THEN [Quantity] ELSE 0 END) 
    -SUM(CASE WHEN FeedbackType='UNSOLD'   THEN [Quantity] ELSE 0 END) AS QuantitySold

FROM
    [xxxxxxx].[dbo].[Sales]
WHERE
    IssueDate < '2019-12-18'
    AND CreationTime < '2019-12-19'
GROUP BY 
    [PoSId]
    ,[ProductCode]
    ,[EditionCode]
    ,[IssueDate]
ORDER BY 
    IssueDate
;

Настройте + - по мере необходимости (если вы добавляете или вычитаете некоторые суммы, это не ясно из вопроса).

...