Erro de sintaxe no caso selecionado
-
13-12-2019 - |
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
se
ocardtype
está vazio então adicioneorderid
paraNotProcessed
se
ocardtype
para algum pedido é MasterCard ou Visa e a data está vazia, adicione orderid aNotProcessed
se
ocardtype
é Paypal ou Sofort, então não verifique o odate e adicione oorderid
paraProcessedSucssessfully
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.