【问题标题】:SQL Server query result for all shipping products所有发货产品的 SQL Server 查询结果
【发布时间】:2018-08-06 11:38:20
【问题描述】:

我有一个如下的产品表。

我想获取每个产品详细信息,其中它的 product_ship_flag 对于所有与 order_number 相同的产品都是“YES”。如果任何 product_ship_flag 为“No”,则整个 order_number 不应出现在输出中。如果所有 product_ship_flag 都为“否”,则不应出现在输出中。

输出将如下所示:

提前致谢。

已编辑:很少有成员甚至没有尝试理解问题,而且有些成员无法回答问题,因此专注于问题。请表现出一些运动性。

【问题讨论】:

  • 我看不懂那个小图片文字...
  • 请点击图片。你能不能得到它的大结果
  • 我的工作地点不允许使用图片..发布示例数据

标签: sql sql-server sql-server-2017


【解决方案1】:

试试这个。 如果内部查询没有为该订单返回任何内容,这意味着所有产品的 flag_ship 都等于 Yes

select * from product p
where not exists (
    select '1' from product p2
    where p2.order_number = p1.order_number
    and p2.product_ship_flag = 'No')

【讨论】:

  • @Navid_H,通过参考您的查询,我将其设置为“select * from products_order p1 where p1.order_number not in (select p2.order_number from products_order p2 where p2.product_ship_flag = 'No') "
【解决方案2】:

这样的基本查询不可行吗?

Select * from product where product_ship_flag = 'Yes' group by order_number

【讨论】:

    【解决方案3】:

    试试这个查询:

        select * from product where orderno not in  (select orderno, count(case when product_ship_flaf='No' then 1 end) from product
        group by orderno
        having count(case when product_ship_flaf='No' then 1 end)>=1)A
    

    【讨论】:

      【解决方案4】:

      @irfan_m,可以使用 MIN 运算符捕获逻辑。例如,当您执行子查询并使用名为 flag 的列时。您可以根据您的要求轻松提取订单。 请参阅下面的模型:

      DECLARE @Producttbl TABLE (id int, order_number varchar(20), product_id varchar(20), stock_cnt int, product_ship_flag VARCHAR(3))
      INSERT INTO @Producttbl
      SELECT 1,'001','SKU1', 1, 'Yes' union all
      SELECT 2,'001','SKU2', 2, 'Yes' union all
      SELECT 3,'001','SKU3', 1, 'No' union all
      SELECT 4,'002','SKU1', 1, 'Yes' union all
      SELECT 5,'002','SKU2', 2, 'Yes' union all
      SELECT 6,'003','SKU1', 1, 'No' union all
      SELECT 7,'003','SKU2', 2, 'No' 
      
      SELECT *
      FROM
       @Producttbl P
       JOIN (
              SELECT order_number, Flag=MIN(product_ship_flag)
              --product_ship_flag is 
              ---"YES" : for all the products of same the order_number
              --If any of the product_ship_flag is "No" then the whole order_number should not be in the output.
              --If all product_ship_flag as "No" then should not be in the output.
              FROM
                  @Producttbl
      
              GROUP BY 
              order_number
          )S ON
          S.order_number=P.order_number
      WHERE
          S.Flag='Yes'
      

      查看以下结果:

      【讨论】:

        【解决方案5】:

        在这种情况下,左连接可能会很方便。

        DECLARE @ProducttblTEST TABLE (id int, order_number varchar(20), product_id 
        varchar(20), stock_cnt int, product_ship_flag VARCHAR(3))
        INSERT INTO @ProducttblTEST
        SELECT 1,'001','SKU1', 1, 'Yes' union all
        SELECT 2,'001','SKU2', 2, 'Yes' union all
        SELECT 3,'001','SKU3', 1, 'No' union all
        SELECT 4,'002','SKU1', 1, 'Yes' union all
        SELECT 5,'002','SKU2', 2, 'Yes' union all
        SELECT 6,'003','SKU1', 1, 'No' union all
        SELECT 7,'003','SKU2', 2, 'No' 
        
        select * from @ProducttblTEST a
        left join (select * from @ProducttblTEST where product_ship_flag = 'no') b on 
        a.order_number = b.order_number
        where a.product_ship_flag = 'yes' and b.order_number is null
        

        【讨论】:

          猜你喜欢
          • 2011-03-28
          • 2020-11-07
          • 1970-01-01
          • 2022-06-22
          • 2020-05-16
          • 1970-01-01
          • 2017-10-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多