Errore di sintassi in caso di selezione
-
13-12-2019 - |
Domanda
Ho iniziato a imparare SQL pochi giorni fa e ho la seguente query che mi dà un errore vicino a "Case" e non riesco a capirlo:
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
.
Immagino che tu possa ottenere ciò che il codice questo dovrebbe fare, ma non sono sicuro se questo è il modo giusto per utilizzare 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
+-----------------+------------+------------+
.
Risultato atteso
+-----------+------------------------+--------------+
| catalogid | ProcessedSucssessfully | NotProcessed |
+-----------+------------------------+--------------+
| 353 |o737,o739 | |
| 364 |o738,o740 | |
| 882 |o741 | |
| 224 | |o742,o743 |
+-----------+------------------------+--------------+
.
Ho le seguenti condizioni che puoi trovare nel caso statment del codice sopra
- .
-
Se
ocardtype
è vuoto, aggiungiorderid
aNotProcessed
-
Se
ocardtype
per qualche ordine è MasterCard o Visa e l'Odate è vuoto, quindi aggiungi OrderID aNotProcessed
-
Se
ocardtype
è PayPal o SoFort, quindi non controllare il controllo di Odate e aggiungere ilorderid
aProcessedSucssessfully
Soluzione
Verifica questa richiesta
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
.
demo su sqlfiddle
Altri suggerimenti
Sembra che tu stia utilizzando la clausola FROM
prima di CASE
e non dopo:
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
.
Altre cose in cui posso pensare è che non stai restituendo true o false con CASE
e che potrebbe farti un errore.