سؤال

لقد بدأت تعلم 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     |
+-----------+------------------------+--------------+

لدي الشروط التالية التي يمكنك العثور عليها في بيان الحالة الخاص بالكود أعلاه

  1. لو ocardtype فارغ ثم أضف orderid ل NotProcessed

  2. لو ocardtype بالنسبة لبعض الطلبات، تكون بطاقة MasterCard أو Visa ويكون الرقم فارغًا، ثم قم بإضافة معرف الطلب إليه NotProcessed

  3. لو 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 وهذا قد يحصل لك خطأ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top