سؤال

لدي عمود تبدو شيئا مثل هذا:

CASE
    WHEN col1 > col2 THEN SUM(col3*col4)
    ELSE 0
END AS some_product

وأود أن وضعه في المجموعة فقرة ، ولكن يبدو أن هذا يسبب مشاكل لأن هناك دالة تجميع في العمود.هل هناك طريقة مجموعة من عمود الاسم المستعار مثل some_product في هذه الحالة, أم أريد أن أضع هذا في فرعي و معني ذلك ؟

هل كانت مفيدة؟

المحلول

تخميني هو أن كنت لا تريد حقا أن GROUP BY some_product.

على الجواب: "هل هناك طريقة GROUP BY عمود الاسم المستعار مثل some_product في هذه الحالة, أم أريد أن أضع هذا في فرعي و معني هذا؟" هو: يمكنك لا GROUP BY عمود الاسم المستعار.

على SELECT شرط فيها عمود الأسماء المستعارة تعيين ما لا يتم معالجتها إلا بعد GROUP BY البند.مضمنة أو الجدول المشترك التعبير (CTE) يمكن أن تستخدم لجعل النتائج المتاحة من أجل تجميع.

مضمنة عرض:

select ...
from (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
   from ...
   group by col1, col2 ... ) T
group by some_product ...

CTE:

with T as (select ... , CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END AS some_product
   from ...
   group by col1, col2 ... )
select ...
from T
group by some_product ... 

نصائح أخرى

شانون الجواب هو الصحيح من الناحية الفنية، يبدو مبالغة.

والحل بسيط هو أن تحتاج إلى وضع خلاصة بك خارج بيان case. هذا ينبغي أن تفعل خدعة:

sum(CASE WHEN col1 > col2 THEN col3*col4 ELSE 0 END) AS some_product

وأساسا، رمز القديم يقول SQL لتنفيذ sum(X*Y) لكل خط على حدة (ترك كل سطر مع الإجابة الخاصة التي لا يمكن تصنيفها).

وخط كود كنت قد كتبت يأخذ المنتج المبلغ، وهو ما تريد.

إذا كنت تجميع بعض قيمة أخرى، ثم بدلا من ما لديك،

وذلك بكتابة

Sum(CASE WHEN col1 > col2 THEN SUM(col3*col4) ELSE 0 END) as SumSomeProduct

إذا، OTOH، وتريد أن group By التعبير الداخلي، (col3*col4) ثم

وكتابة group By لتتناسب مع التعبير ث / س SUM ...

Select Sum(Case When col1 > col2 Then col3*col4 Else 0 End) as SumSomeProduct
From ...

Group By Case When col1 > col2 Then col3*col4 Else 0 End 

وأخيرا، إذا كنت ترغب في مجموعة وبحلول الكلي الفعلي

Select SumSomeProduct, Count(*), <other aggregate functions>
From (Select <other columns you are grouping By>, 
      Sum(Case When col1 > col2 
          Then col3*col4 Else 0 End) as SumSomeProduct
      From Table
      Group By <Other Columns> ) As Z
Group by SumSomeProduct
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top