خطأ في بناء الجملة في حالة التحديد
-
13-12-2019 - |
سؤال
لقد بدأت تعلم SQL منذ بضعة أيام ولدي الاستعلام التالي الذي يعطيني خطأ بالقرب من "الحالة" ولا يبدو أنني أستطيع اكتشافه:
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 ويكون الرقم فارغًا، ثم قم بإضافة معرف الطلب إليهNotProcessed
لو
ocardtype
هو Paypal أو Sofort، فلا تتحقق من التاريخ وأضف الملفorderid
لProcessedSucssessfully
المحلول
تحقق من هذا الطلب
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
العرض التجريبي قيد التشغيل SQLFiddle
نصائح أخرى
يبدو أنك تستخدم FROM
جملة من قبل CASE
وليس بعد:
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
وهذا قد يحصل لك خطأ.