【问题标题】:SQL query to get pending rows获取待处理行的 SQL 查询
【发布时间】:2020-02-04 12:57:01
【问题描述】:

基本细节

+----+---------------------+
| DocumentId  | DocumentNo |
+----+---------------------+
|  1          |  100       |
+----+---------------------+

订单项

+----+--------+------------+
| Id | ItemNo | DocumentId |
+----+--------+------------+
|  1 |   4001 |          1 |
|  2 |   4002 |          1 |
|  3 |   4003 |          1 |
|  4 |   4004 |          1 |
+----+--------+------------+

选择列表

+----+------------+---------------+--------+----------+------------+
| Id | DocumentNo | ReservationNo | ItemNo | StatusId | PickListNo |
+----+------------+---------------+--------+----------+------------+
|  1 |        100 |           100 |   4001 |        1 |    0000001 |
|  2 |        100 |           100 |   4002 |        2 |    0000001 |
|  3 |        100 |           100 |   4001 |        2 |    0000002 |
|  4 |        100 |           100 |   4003 |        2 |    0000002 |
+----+------------+---------------+--------+----------+------------+

期望的结果:

+----+------------+----------------+
| Id | DocumentNo | LineItemCount  |
+----+------------+----------------+
|  1 |        100 |              3 |
+----+------------+----------------+

主表中的基本详细信息。 BasicDetails 中的一个条目可能有多个 LineItems。

ItemNo 在 lineItem 中是唯一的。

BasicDetails 可能有多个pickList。 例如: DocumentNo 100 here has two pickLists 0000001 and 0000002

0000001 和 0000002 中可能有相同的 itemno,但同一选项列表不能有重复的 itemno。

选择列表方案 2:

+----+------------+---------------+--------+----------+------------+
| Id | DocumentNo | ReservationNo | ItemNo | StatusId | PickListNo |
+----+------------+---------------+--------+----------+------------+
|  1 |        100 |           100 |   4001 |        2 |    0000001 |
|  2 |        100 |           100 |   4002 |        2 |    0000001 |
|  3 |        100 |           100 |   4001 |        2 |    0000002 |
|  4 |        100 |           100 |   4003 |        2 |    0000002 |
+----+------------+---------------+--------+----------+------------+

想要的结果:

+----+------------+----------------+
| Id | DocumentNo | LineItemCount  |
+----+------------+----------------+
|  1 |        100 |              4 |
+----+------------+----------------+

选择列表场景 3:

+----+------------+---------------+--------+----------+------------+
| Id | DocumentNo | ReservationNo | ItemNo | StatusId | PickListNo |
+----+------------+---------------+--------+----------+------------+
|  1 |        100 |           100 |   4001 |        1 |    0000001 |
|  2 |        100 |           100 |   4002 |        2 |    0000001 |
|  3 |        100 |           100 |   4001 |        1 |    0000002 |
|  4 |        100 |           100 |   4003 |        2 |    0000002 |
+----+------------+---------------+--------+----------+------------+

期望的结果是:

+----+------------+----------------+
| Id | DocumentNo | LineItemCount  |
+----+------------+----------------+
|  1 |        100 |              3 |
+----+------------+----------------+

我的查询:

   select b.documentid,b.documentno,count(l.id) cnt
   from basicdetails b left join lineitems l on b.documentid= l.documentid
   left join picklist p on l.itemno =p.itemno where p.statusid=1
   group by  b.documentid,b.documentno 

【问题讨论】:

  • 您的问题是什么?你想达到什么目的?
  • @Cid 我很难用语言解释。这就是为什么我给出了多个场景。 documentno 100 的 lineitems 中有 4 个不同的 itemno,即.. 4001,4002,4003,4004。其中,如果在选项列表 4001 中标记为 1,则意味着现在我们只剩下 3 个条目编号用于文档编号 100。如果 4001 和 4002 都为 1,那么条目编号将是 2。选项列表中重复的 4001 被计为一个 4001跨度>
  • 嗨@SamuraiJack,你能解释一下你有 LineItemCount = 3 的场景3吗?谢谢!
  • 这里的输出毫无意义。有些业务规则您没有共享,或者至少它们根本不清楚。您得到的计数与您提供的解释相矛盾。

标签: sql sql-server tsql sql-server-2008


【解决方案1】:

我不是 100% 确定您需要什么,但目前为止:

select b.documentid
       , b.documentno
       , (select count(*) from PickList) - (select count(*) 
                                            from PickList pn1
                                            where pn1.StatusId = 1)
from BasicDetails b 
left join LineItems l on b.DocumentId = l.DocumentId
left join PickList p on l.ItemNo = p.ItemNo 
where p.StatusId = case when (select count(*) cnt_all 
                              from PickList pn
                              where pn.StatusId = 1) = 0 then 2
                        else 1
                   end
group by  b.documentid
          , b.documentno ;

演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=797817d75bda9d81bbebcf43d584564a

如果我了解来自 cmets 的信息,那将是正确的:

select b.documentid
       , b.documentno
       , case when (select count(*) cnt_all 
                    from PickList pn
                    where pn.StatusId = 1) = 0
              then (select count(*) cnt_all
                    from LineItems)
              else (select count(*) cnt_all
                    from LineItems) -count(distinct l.id)
         end cnt
from BasicDetails b 
left join LineItems l on b.DocumentId = l.DocumentId
left join PickList p on l.ItemNo = p.ItemNo
where p.StatusId = case when (select count(*) cnt_all 
                              from PickList pn
                              where pn.StatusId = 1) = 0 then 2
                        else 1
                   end
group by  b.documentid
          , b.documentno;

演示 2:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=233e5ef14a2b6aaa45ec509872f240c9

【讨论】:

  • 0060105254 是什么?
  • 嗨@SamuraiJack 对不起,我不明白。在哪里 ?另外,请从上面回答我的问题?
  • 哦,对不起。我粘贴了错误的值。我的意思是什么是“cnt_all”,但现在我知道它只是 count(*) 的别名。我尚未在我的工作计算机上对其进行测试,但您的答案似乎是正确的答案。不过,我需要一些时间来解决您的问题。
  • 顺便说一句,我需要计算 lineitems。不是选择列表。我的意思是,如果选择列表中有零个记录,那么 100 的计数将是 4。因为有 4 个项目。我应该在我的问题中包含这个
  • 嗨@SamuraiJack,我已经添加了另一个查询,所以你也可以检查一下。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多