SQL مجموعة على حدة مع بيان وظيفة الكلي
-
05-07-2019 - |
سؤال
لدي عمود تبدو شيئا مثل هذا:
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