Sql 选择大小写中的语法错误

Sql 选择大小写中的语法错误,sql,sql-server-2008-r2,case,for-xml-path,Sql,Sql Server 2008 R2,Case,For Xml Path,我几天前开始学习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 nu

我几天前开始学习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     |
+-----------+------------------------+--------------+
我有以下条件,你可以在上述代码的情况下找到

  • 如果
    ocardtype
    为空,则将
    orderid
    添加到
    NotProcessed

  • 如果某些订单的
    ocardtype
    为MasterCard或Visa,且odate为空,则将orderid添加到
    NotProcessed

  • 如果
    ocardtype
    是Paypal或Sofort,则不要检查odate并将
    orderid
    成功添加到
    Processed


  • 似乎您是在
    案例之前使用
    FROM
    子句,而不是在以下情况之后使用:

    SELECT   ProductNumber, Category =
          CASE ProductLine
             WHEN 'R' THEN 'Road'
             WHEN 'M' THEN 'Mountain'
             WHEN 'T' THEN 'Touring'
             WHEN 'S' THEN 'Other sale items'
             ELSE 'Not for sale'
          END,
       Name
    FROM Production.Product
    ORDER BY ProductNumber
    
    我能想到的另一件事是,您没有使用
    CASE
    返回true或false,这可能会导致您出错。

    检查此请求

    SELECT CatalogId, ProcessedSucssessfully = 
           STUFF((SELECT ', ' + b.OrderId
                  FROM oitmes b JOIN orders o ON b.OrderId = o.OrderId
                  WHERE b.CatalogId = a.CatalogId
                  AND (o.OcardtType in ('PayPal','Sofort') OR o.OcardtType in  ('mastercard','visa') and o.odate is not null)    
                  FOR XML PATH('')), 1, 2, ''),
                      NotProcessed =
            STUFF((SELECT ', ' + c.OrderId
                   FROM oitmes c JOIN orders o ON c.OrderId = o.OrderId
                   WHERE c.CatalogId = a.CatalogId
                   AND (o.OcardtType in ('mastercard') OR o.OcardtType is null) and o.odate is null
                   FOR XML PATH('')), 1, 2, '')
    FROM oitmes a
    GROUP BY a.CatalogId
    

    演示

    第一个线索是,开放括号的数量与封闭括号的数量不同。理想情况下,它们应该匹配。你有10个左括号和12个右括号。换句话说,您有多个基本语法错误。首先纠正这些问题,然后看看你是否还有问题。此外,在提问时,您需要指定使用的是哪种类型的SQL,因为它们都不同。请指定您的RDBMS,MS SQL Server,wich version?@user1570048您的语法似乎有一些问题。你到底想在这里干什么?你能发布一些样本数据和预期结果吗?@bluefeet当然,我会马上发布