编写一个实现以下条件的查询

问题描述 投票:0回答:1

编写一个实现以下条件的查询;其输出如下表所示。

  • 对于每个订单,如果购买数量少于 3 件且金额在 1 到 5 之间,则显示“错误购买”输出。
  • 对于每个订单,如果购买数量在 4 到 20 件之间且金额在 6 到 10 之间,则显示“适度购买”输出。
  • 对于每个订单,如果购买数量在 21 到 30 件之间,金额在 11 到 40 之间,则会显示“Good Buy”输出。

在其他情况下,显示“其他类型的购买”。

将形成的列命名为“购买类型”。

所需输出:

enter image description here

我的问题是,我需要学习如何在我设置的条件后添加最后一列(购买类型),并根据应用的要求将所需的文本放置在相关字段中。

SELECT
    OrderID, ProductID, UnitPrice, Qty, Discount
FROM
    dbo.OrderDetails
WHERE
    Qty < 3 
    AND UnitPrice BETWEEN 1 AND 5
    .
    .
    ???
sql sql-server where-clause case where-in
1个回答
0
投票

在没有演示 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 表达式将返回第一个匹配项。

© www.soinside.com 2019 - 2024. All rights reserved.