我有以下 sql 查询来了解它的作用请阅读下面的描述
select catalogid, numitems, allitems - numitems ignoreditems
from (
select i.catalogid,
sum(case when (ocardtype in ('PayPal','Sofort') OR
ocardtype in ('mastercard','visa') and
odate is not null) AND NOT EXISTS (
select * from booked b
where b.ignoredoid = o.orderid
) then numitems
else 0 end) numitems,
sum(numitems) allitems
from orders o
join oitems i on i.orderid=o.orderid
group by i.catalogid
) X
以及以下 sql 表
项目表
+---------+-----------+----------+
| orderid | catalogid | numitems |
+---------+-----------+----------+
| O737 | 353 | 1 |
| O738 | 364 | 4 |
| O739 | 353 | 3 |
| O740 | 364 | 6 |
| O741 | 882 | 2 |
| O742 | 224 | 5 |
| O743 | 224 | 2 |
+---------+-----------+----------+
订单表
+-----------------+------------+------------+
| orderid | ocardtype | odate |
+-----------------+------------+------------+
| O737 | Paypal | | 'OK
| O738 | MasterCard | 01.02.2012 | 'OK
| O739 | MasterCard | 02.02.2012 | 'OK
| O740 | Visa | 03.02.2012 | 'OK
| O741 | Sofort | | 'OK
| O742 | | | 'ignore because ocardtype is empty
| O743 | MasterCard | | 'ignore because Mastercard no odate
+-----------------+------------+------------+
结果数据表
+-----------+----------+--------------+
| catalogid | numitems | ignoreditems |
+-----------+----------+--------------+
| 353 | 4 | 0 |
| 364 | 10 | 0 |
| 882 | 2 | 0 |
| 224 | 0 | 7 |
+-----------+----------+--------------+
想法是根据 oitems 表中的数据对具有相同目录 ID 的产品的 numitems 列求和,并具有以下条件
- 如果
ocardtype
为空,则忽略numitems
并将其视为0
总和并将忽略的项目加到ignoreditems
列中 - 如果
ocardtype
某些订单是 MasterCard 或 Visa 并且odate
为空 然后忽略numitems
并将其视为0
并将忽略的项目汇总到ignoreditems
列 - 如果 ocardtype 是 Paypal 或 Sofort,那么只需进行
numitems
总和而不检查,odate
因为这些类型不需要odate
- 在另一个名为booked 的表中,我有一个名为ignoreoid 的列,此列包含
orderids
上表中我想忽略的列,即使满足上述3 个条件
至此,感谢@Richard aka cyberkiwi 对他在这个问题上的回答,查询运行良好
问题是,我需要结果数据表如下所示
+-----------+----------+--------------+-------------------+
| catalogid | numitems | ignoreditems | orderidcollection |
+-----------+----------+--------------+-------------------+
| 353 | 4 | 0 | O737,O739 |
| 364 | 10 | 0 | O738,O740 |
| 882 | 2 | 0 | O741 |
| 224 | 0 | 7 | |'O742 & O743 are ignored
+-----------+----------+--------------+-------------------+
如您所见,唯一的变化是添加了orderidcollection
列,只有在代码中没有忽略该顺序时,它才必须将 以逗号分隔的新列添加orderid
到新列中,我已经搜索了几个小时没有运气!这甚至可以用 SQL 吗?