我有以下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表中的数据上具有相同catalogid的产品的numitems列求和
ocardtype
为空,则忽略numitems
并将其视为0
总和并将被忽略的项目求和到ignoreditems
列中ocardtype
某些订单是MasterCard或Visa,并且odate
为空,则忽略numitems
并将其视为0
并将被忽略的项目求和到ignoreditems
列中numitems
总和而不检查,odate
因为这些类型不需要odate
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甚至有可能吗?
我对上一个问题的Linq-to-Sql回答扩展到了这个问题(LINQpad查询):
Dim odateRequired = {"MasterCard", "Visa"}
Dim odateNotRequired = {"Paypal", "Sofort"}
Dim result = From o In Orders Join i In Oitems On o.orderid Equals i.orderid _
Let check = Not (From b In Bookeds Where b.ignoredoid=i.orderid).Any _
AndAlso o.ocardtype IsNot Nothing _
AndAlso ((odateRequired.Contains(o.ocardtype) AndAlso o.odate IsNot Nothing) _
OrElse odateNotRequired.Contains(o.ocardtype)) _
Group By i.catalogid Into _
numitems = Sum(If(check, i.numitems, 0)), _
ignoreditems = Sum(If(check, 0, i.numitems)), _
group
Select catalogid, numitems, ignoreditems, _
orderidcollection = String.Join(",", (From g in group Where g.check Select g.i.orderid))
result.Dump
请注意,此解决的问题多SQL查询,以确定orderids
每个catalogid
地方check
是True
累积的每个orderidcollection
。可能有一个更有效的解决方案(或者使用一些可能是复杂的Linq-
to-Sql来使生成的SQL等效于String.Join
,或者catalogid, numitems, check, orderid
使用Linq-
to-Sql进行获取,然后使用Linq-to-objects做最后的积累)。
还要注意,此查询包括您的Booked
表(使用LINQpad的复数形式)。
我有一个excel表格,有n行6列,我需要将所有这些行插入数据库表。所以我想把每一行的单元格转换成逗号分隔,并用引号列表标记。此外,如果任何单元格为空,则其值应标记为空字符串(“”) 示例:示例图像
我有以下三个要素: 请帮助用一个更好的方法来处理这件事。
我们正在对CITY、ST、ZIP形式的邮政编码进行丢失验证。这些可以跨越国家,因此以下所有内容都是有效的: > 宾夕法尼亚州匹兹堡,15020 安大略省汉密尔顿市L8E 4B3 我想验证的是,我们有三个逗号分隔的单词(空格可以)。所有这些都是有效的: foo、bar、baz 然而,这些将是无效的,因为它们没有两个逗号和三个单词: foo, bar 嘘,酒吧,巴兹,砰 foo,酒吧, foo, ba
问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: mysql是多列数组 我有两个表: 帖子表 Gallery中的值是Images表中的主键: 图片表 我之所以这样做,而不仅仅是在Images表中添加PostID键,是因为这些图像可以与许多不同的帖子相关联。我想我可以为关系添加另一个表,但是就我要添加到其中的jQuery脚本而言,逗号分隔的值更易于使用。 如果我在需要与PostI
我试图在一个用冒号“:”分隔的列表中添加所有三个元素 示例输出: 我的尝试:
我正在创建一个新的PDF,其中将包含其他文档的汇编。 这些其他文档可以是word/excel/图像/PDF。 我希望将所有这些内容添加到表中的单元格中,该单元格被添加到文档中-这给了我自动添加页面的好处,将元素定位在单元格中而不是页面中,并允许我更轻松地将内容保持在与我提供的相同的顺序(如img,doc,pdf,img,pdf等) 向表中添加图像非常简单。 我正在将word/excel文档转换为P