sql - 获取待处理行的 SQL 查询
问题描述
基本详情
+----+---------------------+
| 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
解决方案
我不是 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
如果我从评论中了解信息,那将是正确的:
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
推荐阅读
- java - 将生成的类捆绑到一个 jar 中并将其添加到构建类路径中
- php - php数组根据值删除n个项目
- php - 如何正确使用 where、whereJsonDoesntContain 和 whereJsonContains 的多重组合
- javascript - 将表单字段设为字母数字时无法读取未定义的属性“匹配”
- javascript - onchange 必须从它正在存储值的计数器中删除值
- java - Solr 有时会停止为生产中的查询返回结果。
- android - 通过在 URL 中输入路径打开 PDF 文件
- database - 正确的 Google Cloud 产品
- php - docker-php-ext-configure、docker-php-ext-install 和 docker-php-ext-enable 有什么作用?
- java - 启动层初始化时出错