【问题标题】:Return a Complete sales order where a given item is purchased SQL返回购买给定项目的完整销售订单 SQL
【发布时间】:2018-06-26 15:42:05
【问题描述】:

我正在尝试查询我们的 Sales_Order_Line_Item 表。我们正在引入一个新的“关税”商品代码,我们的销售人员需要将此代码添加到所有商品以“WI”开头的订单中。因此,我需要创建一个查询,以显示所有商品代码以“WI”开头但缺少“关税”代码的订单。

我似乎不知道如何返回显示此数据的列表。

为简单起见,我的 Sales_Order_Line_Item 表有以下 3 列:

UNIQUE_LINE_ID, SALE_ORDER_#, ITEM_#

【问题讨论】:

  • 样本数据和预期结果会有所帮助。
  • 到目前为止你有什么尝试???

标签: sql select where


【解决方案1】:

一个肮脏的技巧是使用case 表达式并计算这些项目出现的次数:

SELECT   sale_order_no
FROM     sales_order_line_item
GROUP BY sale_order_no
HAVING   COUNT(CASE WHEN item_code LIKE 'WI%' THEN 1 END) > 0 AND
         COUNT(CASE WHEN item_code = 'Tarrif' THEN 1 END) = 0

【讨论】:

  • Mureinik,我只是替换了 CASE 表达式(即使它是有效的)以避免读者混淆。赞成。
  • @KamilG。我对是否使用较短的语法或遵循套件并让两个 case 表达式看起来相同感到矛盾。看到您的编辑后,这样的代码肯定看起来更好。
【解决方案2】:

应该是这样的:

select * from Sales_Order_Line_Item
where ItemCode like 'wi%'
and tariff is null

【讨论】:

    【解决方案3】:

    如果您想要完整的订单详细信息,您可以改用EXISTS/NOT EXISTS

    select so.*
    from sales_order_line_item so
    where exists (select 1 from sales_order_line_item sol where sol.sale_order_no = s.sale_order_no and sol.item_code LIKE 'WI%') and
          not exists (select 1 from sales_order_line_item sol where sol.sale_order_no = s.sale_order_no and sol.item_code  = 'Tarrif');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多