在SQL Server Management Studio中循环

adu*_*826 0 sql-server rdms

我得到了717个SKU的清单,这些清单必须将“年销售额”和“已售出单位”的总值相加。我开发了一个代码,可以按年份搜索SKU并接收总金额。我想知道是否可以循环输入更多的SKU,这样我就不必逐个SKU逐一检查。

我熟悉Loop语句,但不是执行它们的最佳人选。想知道Microsoft SQL Server Management Studio 2017中是否有办法做到这一点。

我尝试过声明并重复代码,但是效率很低。

DECLARE @SDate date
SET @SDate = '01/01/2018'
DECLARE @EDate date
SET @EDate = '12/31/2018'
DECLARE @Sku varchar(20)
SET @Sku = 'SN1580' 


SELECT        SUM(Amount) AS EXPR1
FROM            dbo.[Threshold Enterprises$Sales Invoice Line]
WHERE        ([Shipment Date] BETWEEN @SDate AND @EDate) AND (No_ = N'SN1580')
SELECT        SUM(Quantity) AS EXPR1
FROM            dbo.[Threshold Enterprises$Sales Invoice Line]
WHERE        ([Shipment Date] BETWEEN @SDate AND @EDate) AND (No_ = N'SN1580')

SELECT        SUM(Amount) AS EXPR1
FROM            dbo.[Threshold Enterprises$Sales Invoice Line]
WHERE        ([Shipment Date] BETWEEN @SDate AND @EDate) AND (No_ = N'SN0350')
SELECT        SUM(Quantity) AS EXPR1
FROM            dbo.[Threshold Enterprises$Sales Invoice Line]
WHERE        ([Shipment Date] BETWEEN @SDate AND @EDate) AND (No_ = N'SN0350')
Run Code Online (Sandbox Code Playgroud)

期望结果能给我一些类似的东西

SN1234
Amount 1000
Sum 200

SN3456
Amount 2000
Sum 100
Run Code Online (Sandbox Code Playgroud)

或者是否有一种方法可以将结果轻松导出为ex​​cel。

Lar*_*rnu 5

如果您需要传递多个SKU,则可以使用表变量:

DECLARE @SDate date
SET @SDate = '01/01/2018'
DECLARE @EDate date
SET @EDate = '12/31/2018'

DECLARE @Skus table (SKU varchar(20);

INSERT INTO @SKUs
VALUES('SN1580'),
      ('SN0350');

SELECT SIL.[No_] AS SKU,
       SUM(SIL.Amount) AS Amount,
       SUM(SIL.Quanity) AS Quantity
FROM dbo.[Threshold Enterprises$Sales Invoice Line] SIL --I recommeond against special characters (including white space) in object names
     JOIN @SKUs S ON SIL.[No_] = S.SKU
WHERE SIL.[Shipment Date] BETWEEN @SDate AND @EDate
GROUP BY SIL.[No_];
Run Code Online (Sandbox Code Playgroud)

如果这是使用此参数化查询的应用程序,则可能需要创建用户定义的表类型,然后使用该表类型:

CREATE TYPE dbo.SKUs AS TABLE (SKU varchar(20));
Run Code Online (Sandbox Code Playgroud)

Microsoft的文档在表值参数中介绍了如何使用它们。

补充说明一下,如果您的栏中[Shipment Date]同时包含日期和时间值(并且时间可能不是00:00:00),则我建议您反对BETWEEN。这是因为最后一天的午夜之后的任何时间都不会在这两个日期之间。例如2018-04-30 00:00:00.003不在2018-04-01和之间2018-04-30

因此,如果确实有日期和时间值,建议使用此子句:

WHERE SIL.[Shipment Date] >= @SDate
  AND SIL.[Shipment Date] < DATEADD(DAY, 1, @EDate)
Run Code Online (Sandbox Code Playgroud)