Pergunta

Comecei a aprender SQL há alguns dias e tenho a seguinte consulta que me dá um erro próximo a "caso" e não consigo entender:

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

Acho que você entendeu o que esse código deve fazer, mas não tenho certeza se essa é a maneira correta de usar 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
    +-----------------+------------+------------+

resultado esperado

+-----------+------------------------+--------------+
| catalogid | ProcessedSucssessfully | NotProcessed |
+-----------+------------------------+--------------+
|       353 |o737,o739               |              |
|       364 |o738,o740               |              |
|       882 |o741                    |              |
|       224 |                        |o742,o743     |
+-----------+------------------------+--------------+

eu tenho as seguintes condições que você pode encontrar na declaração de caso do código acima

  1. se ocardtype está vazio então adicione orderid para NotProcessed

  2. se ocardtype para algum pedido é MasterCard ou Visa e a data está vazia, adicione orderid a NotProcessed

  3. se ocardtype é Paypal ou Sofort, então não verifique o odate e adicione o orderid para ProcessedSucssessfully

Foi útil?

Solução

verifique esta solicitação

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

Demonstração ativada SQLFiddle

Outras dicas

Parece que você está usando o FROM cláusula antes CASE e não depois:

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

Outra coisa que consigo pensar é que você não está retornando verdadeiro ou falso com CASE e isso pode gerar um erro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top