【问题标题】:Complex SQL request复杂的 SQL 请求
【发布时间】:2020-04-30 04:10:07
【问题描述】:

我的 sql 数据库中有一个具有这种结构的表

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 个潜在值:“DELIVERY”、“RESTOCKING”、“MISSING”、“UNSOLD”

我创建了一个 sql 脚本,它为我提供了专用 pointOfSale、productCode、versionCode 和发行日期的缺失数量总和。

  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”,根据此公式计算 => 已售数量 = 交付数量 - 缺失数量 - 未售出数量

如何修改我的脚本以创建这两个新列?

我需要的结果是这样的:

PS:不要忘记我在这个脚本中的“where”条件只考虑了缺失的数量(Where FeedbackType='MISSING')=> 做我现在需要的我想我们需要改变这个“where”条件或者可能在其他任何地方做另一个 where 条件。

提前感谢您的帮助!

【问题讨论】:

标签: sql sql-server sql-server-2008 sql-server-2012


【解决方案1】:

称为条件聚合。

一种方法是将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
;

根据需要调整+-(是加还是减一些和,从问题上看不清楚)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2023-04-06
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多