SQL查询以查找具有相似ID的行,“不” /“有”在辅助列中具有模式

时间:2018-12-18 20:56:15

标签: sql sql-server database powerbi

我正在尝试查询共享重复ID(彼此相关)但在辅助列中保留特定模式的行。

想象一下,这是一个网上商店,每个订单都有多个阶段。每个orderid在表中都有多个条目。

我想排除某些Orderid,因为它们具有特定的模式。

示例:

Orderid     Stage     OtherInfo
----------------------------------
1           step 1    random info    
1           step 3    random info
1           step 4    random info
3           step 1    random info
3           step 2    random info
5           step 3    random info
4           step 1    random info
4           step 2    random info
4           step 3    random info

现在,我要查询相应的OrderID符合条件的行-例如:

  • 已通过“第1步”和“第3步” //而不是“第2步”

预期结果为:

Orderid      Stage     OtherInfo
-----------------------------------
1            step 1    random info
1            step 3    random info
1            step 4    random info

3 个答案:

答案 0 :(得分:1)

您可以使用聚合和having获取订单ID:

select orderid
from t
group by orderid
having sum(case when stage = 'step 1' then 1 else 0 end) > 0 and
       sum(case when stage = 'step 3' then 1 else 0 end) > 0 and
       sum(case when stage = 'step 2' then 1 else 0 end) = 0;

要获取原始行:

select t.*
from t
where t.orderid in (select orderid
                    from t
                    group by orderid
                    having sum(case when stage = 'step 1' then 1 else 0 end) > 0 and
                           sum(case when stage = 'step 3' then 1 else 0 end) > 0 and
                           sum(case when stage = 'step 2' then 1 else 0 end) = 0
                   );

答案 1 :(得分:1)

使用EXISTS检查条件:

SELECT * 
FROM tablename t
WHERE
  EXISTS (SELECT 1 FROM tablename WHERE tablename.Orderid = t.Orderid AND tablename.stage = 'step 1')
  AND
  EXISTS (SELECT 1 FROM tablename WHERE tablename.Orderid = t.Orderid AND tablename.stage = 'step 3')
  AND
  NOT EXISTS (SELECT 1 FROM tablename WHERE tablename.Orderid = t.Orderid AND tablename.stage = 'step 2');

答案 2 :(得分:1)

您也可以使用

 $comments = DB::table('comment')
        ->join('user', 'comment.user_id', '=', 'user.id')
        ->select('comment.*', 'user.name')
        ->where(image_id, $id)
        ->get();

OR

SELECT *
FROM T TT
WHERE CASE WHEN EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 1')
           THEN 
      CASE WHEN EXISTS(SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 3')
           THEN 
      CASE WHEN NOT EXISTS (SELECT 1 FROM T WHERE OrderID = TT.OrderID AND Stage = 'step 2')
           THEN 1
      END
      END
      END = 1;