编写一个实现以下条件的查询;其输出如下表所示。
在其他情况下,显示“其他类型的购买”。
将形成的列命名为“购买类型”。
所需输出:
我的问题是,我需要学习如何在我设置的条件后添加最后一列(购买类型),并根据应用的要求将所需的文本放置在相关字段中。
SELECT
OrderID, ProductID, UnitPrice, Qty, Discount
FROM
dbo.OrderDetails
WHERE
Qty < 3
AND UnitPrice BETWEEN 1 AND 5
.
.
???
在没有演示 DDL/DML 的情况下,我使用了已有的数据集,该数据集遵循典型的发票模式。
SELECT *,
CASE WHEN TotalQuantity BETWEEN 0 AND 3 AND TotalPrice BETWEEN 1 AND 5.999 THEN 'Bad'
WHEN TotalQuantity BETWEEN 4 AND 20 AND TotalPrice BETWEEN 6 AND 10.999 THEN 'Moderate'
WHEN TotalQuantity BETWEEN 21 AND 30 AND TotalPrice BETWEEN 11 AND 40.999 THEN 'Good'
ELSE 'Other Type Of Purchase'
END AS TypeOfPurchase
FROM (
SELECT *, SUM(ii.Quantity) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) AS TotalQuantity, SUM(ii.Quantity*ii.Price) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) AS TotalPrice,
CASE WHEN SUM(ii.Quantity) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) BETWEEN 0 AND 3 AND SUM(ii.Quantity*ii.Price) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) BETWEEN 1 AND 5.999 THEN 'Bad'
WHEN SUM(ii.Quantity) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) BETWEEN 4 AND 20 AND SUM(ii.Quantity*ii.Price) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) BETWEEN 6 AND 10.999 THEN 'Moderate'
WHEN SUM(ii.Quantity) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) BETWEEN 21 AND 30 AND SUM(ii.Quantity*ii.Price) OVER (PARTITION BY ii.InvoiceID ORDER BY (SELECT 1)) BETWEEN 11 AND 40.999 THEN 'Good'
ELSE 'Other Type Of Purchase'
END AS TypeOfPurchase
FROM InvoiceItems ii
) ii
ORDER BY ii.InvoiceID, ii.Sequence
内部查询是您真正需要的,但在举例说明 case 表达式方面做得很差,所以我也将其包装到子查询中,简化了条件。您会注意到,对于价格范围,我将其上限扩展到 X.999。我们正在处理货币,因此使用显式 INT 类型值意味着如果我们完全遵循您的要求,5.001 - 5.999 之间的值可能会丢失。
我假设您想要将总数量和总价格与您的规则进行比较,但仍然返回每个发票项目/详细信息行,因为这似乎是您的伪代码所指示的。
我们使用
WINDOWED FUNCTION
来收集总计,按 PARTITIONED
分组(或 InvoiceID
),并按静态值排序,因为这给出了每行的总计(按行值排序将为我们提供运行总计)。
然后,使用该表达式,我们使用
CASE
表达式来评估特定条件,并在 true 时返回一个值,并使用默认值(或 ELSE
)来捕获不符合任何条件的行。值得注意的是,case 表达式将返回第一个匹配项。