【发布时间】:2012-10-03 11:16:39
【问题描述】:
几天前我开始学习 SQL,我有以下查询,它在“case”附近给我一个错误,我似乎无法弄清楚:
SELECT * , Stuff((SELECT ', ' + CAST( orderid as varchar(10))
FROM( oitems t2
case when (ocardtype in ('PayPal','Sofort') OR
ocardtype in ('mastercard','visa') and
odate is not null) then
FOR XML PATH(''), 1, 2, '') [Proccessed] else FOR XML PATH(''), 1, 2, '') [NotProccessed] end)
FROM orders t1
Group by orderid,t1.odate, t1.ocardtype
我猜你知道这段代码应该做什么,但我不确定这是否是使用 select case 的正确方法。
oitems table
+---------+-----------+----------+
| orderid | catalogid | numitems |
+---------+-----------+----------+
| o737 | 353 | 1 |
| o738 | 364 | 4 |
| o739 | 353 | 3 |
| o740 | 364 | 6 |
| o741 | 882 | 2 |
| o742 | 224 | 5 |
| o743 | 224 | 2 |
+---------+-----------+----------+
orders table
+-----------------+------------+------------+
| 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 | ProcessedSucssessfully | NotProcessed |
+-----------+------------------------+--------------+
| 353 |o737,o739 | |
| 364 |o738,o740 | |
| 882 |o741 | |
| 224 | |o742,o743 |
+-----------+------------------------+--------------+
我有以下条件,你可以在上面代码的case语句中找到
如果
ocardtype为空,则将orderid添加到NotProcessed如果某个订单的
ocardtype是万事达卡或维萨卡,并且日期为空,则将orderid 添加到NotProcessed如果
ocardtype是Paypal 或Sofort,则不要检查日期并将orderid添加到ProcessedSucssessfully
【问题讨论】:
-
第一个线索是开括号的数量与闭括号的数量不同。理想情况下,它们应该匹配。
-
你有 10 个左括号和 12 个右括号。换句话说,您有多个基本语法错误。先纠正那些,然后看看你是否还有问题。此外,在提出问题时,您需要指定您使用的 SQL 类型,因为它们都是不同的。
-
指定您的 RDBMS,似乎是 MS SQL Server,哪个版本?
-
@user1570048 您的语法似乎有几处错误。你到底想在这里做什么?您能否发布一些示例数据,然后发布预期结果?
-
@bluefeet 我马上就去做
标签: sql sql-server-2008-r2 case for-xml-path