SQL запрос для получения ожидающих строк - PullRequest
0 голосов
/ 04 февраля 2020

BasicDetails

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

LineItems

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

PickList

+----+------------+---------------+--------+----------+------------+
| 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 |
+----+------------+----------------+

Basi c детали в основной таблице. Для одной записи в BasicDetails может быть несколько LineItems.

ItemNo уникален в lineItem.

Может быть несколько pickList для BasicDetails. Например: DocumentNo 100 here has two pickLists 0000001 and 0000002

Может быть один и тот же itemno в 0000001 и 0000002, но не может быть повторяющегося itemno для одного и того же списка выбора.

PickList Сценарий 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 |
+----+------------+----------------+

PickList Сценарий 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 

1 Ответ

1 голос
/ 04 февраля 2020

Я не на 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 ;

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

Если я понял информацию из комментарии это было бы тогда правильно:

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

...