简体   繁体   English

使用来自不同行的值的 CASE 表达式

[英]CASE expressions using values from different rows

I have below table我有下表

WITH TMP AS (
SELECT 'XX' AS AGG, 50 AS VALUE, 0 AS MONTH
UNION ALL
SELECT 'XX' AS AGG, 150 AS VALUE, 1 AS MONTH
UNION ALL
SELECT 'XX' AS AGG, 300 AS VALUE, 2 AS MONTH
UNION ALL
SELECT 'YY' AS AGG, 25 AS VALUE, 0 AS MONTH
UNION ALL
SELECT 'YY' AS AGG, 50 AS VALUE, 1 AS MONTH
UNION ALL
SELECT 'YY' AS AGG, 75 AS VALUE, 2 AS MONTH
UNION ALL
SELECT 'ZZ' AS AGG, 500 AS VALUE, 0 AS MONTH
UNION ALL
SELECT 'ZZ' AS AGG, 600 AS VALUE, 1 AS MONTH
UNION ALL
SELECT 'ZZ' AS AGG, 700 AS VALUE, 2 AS MONTH
)
-- CASE WHEN VALUE OF 'XX' > 0 THEN VALUE OF 'ZZ' ELSE 0 END
SELECT 
*
FROM TMP
WHERE 1 = 1

I need to apply following business logic to it always considering the month.我需要始终考虑月份对其应用以下业务逻辑。

CASE WHEN VALUE OF 'XX' > 0 THEN VALUE OF 'ZZ' ELSE 0 END 'XX' 的值 > 0 的情况,然后 'ZZ' 的值 ELSE 0 END

This logic should be mapped into a new table.这个逻辑应该映射到一个新表中。 The result should look like the table below.结果应如下表所示。
I would like to avoid joins to the same table.我想避免加入同一张表。 Is this somehow possible using window functions or something similar?这是否可能使用窗口函数或类似的东西? The idea is to build several case when statement as the one above within the same sql statement.这个想法是在同一个 sql 语句中构建几个 case when 语句作为上面的一个。

IE1 IE1 MONTH
500 500 00 00
600 600 01 01
700 700 02 02

Pivot (conditionally aggregate) your data, and then return the value you need based on your expression:透视(有条件地聚合)您的数据,然后根据您的表达式返回您需要的值:

WITH TMP AS
    (SELECT 'XX' AS AGG,
            50 AS VALUE,
            0 AS MONTH
     UNION ALL
     SELECT 'XX' AS AGG,
            150 AS VALUE,
            1 AS MONTH
     UNION ALL
     SELECT 'XX' AS AGG,
            300 AS VALUE,
            2 AS MONTH
     UNION ALL
     SELECT 'YY' AS AGG,
            25 AS VALUE,
            0 AS MONTH
     UNION ALL
     SELECT 'YY' AS AGG,
            50 AS VALUE,
            1 AS MONTH
     UNION ALL
     SELECT 'YY' AS AGG,
            75 AS VALUE,
            2 AS MONTH
     UNION ALL
     SELECT 'ZZ' AS AGG,
            500 AS VALUE,
            0 AS MONTH
     UNION ALL
     SELECT 'ZZ' AS AGG,
            600 AS VALUE,
            1 AS MONTH
     UNION ALL
     SELECT 'ZZ' AS AGG,
            700 AS VALUE,
            2 AS MONTH),
--Solution
/*WITH */Pvt AS(
    SELECT Month,
           MAX(CASE Agg WHEN 'XX' THEN VALUE END) AS XX,
           --MAX(CASE Agg WHEN 'YY' THEN VALUE END) AS YY,--Not needed hence commented out
           MAX(CASE Agg WHEN 'ZZ' THEN VALUE END) AS ZZ
    FROM TMP
    GROUP BY MONTH)
SELECT CASE WHEN XX > 0 THEN ZZ ELSE 0 END AS IE1,
       MONTH
FROM Pvt;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM