来自多个表的 CASE 表达式

CASE expression from multiple tables

我正在尝试编写一个 CASE 表达式,其中我查看 2 tables(相同的数据库)以输出 1 或 0,然后将该列与 BRANCH 和 EVUSERID 上的一些分组相加。

对于我想要实现的目标,这可能是完全错误的方法,因此我完全愿意接受建议。

事件table

+--------+----------+-----------+---------------------------+-----------+
| BRANCH | EVUSERID | EVENTTYPE |         REFERENC          | ENQUIRYNO |
+--------+----------+-----------+---------------------------+-----------+
|      1 | cunnc    | SAS       | New Cust - Unknown Source |   1468731 |
|      2 | malce    | SAS       | New Cust - Walk-in        |   1792469 |
|      1 | cunnc    | SAS       | Old Cust - Retention      |    897324 |
|      4 | wardt    | OPT       |                           |    986234 |
|      5 | shera    | OPT       |                           |    576324 |
|      4 | hamzk    | SAS       | Old Cust - Service        |   1238746 |
|      5 | chinc    | SAS       | New Cust - Digital        |    687236 |
+--------+----------+-----------+---------------------------+-----------+

排序table

+-----------+---------+
| ENQUIRYNO | NEWUSED |
+-----------+---------+
|   1468731 | N       |
|   1792469 | N       |
|    897324 | U       |
|    986234 | N       |
|    576324 | U       |
|   1238746 | U       |
|    687236 | U       |
+-----------+---------+

我想要的输出是

+--------+----------+----------------+---------+-------+---------+-----------+---------+-------------+--------------+---------+
| BRANCH | EVUSERID | Unknown Source | Walk-in | Phone | Digital | Retention | Service | New Enquiry | Used Enquiry | Unknown |
+--------+----------+----------------+---------+-------+---------+-----------+---------+-------------+--------------+---------+
|      1 | cunnc    |              1 |       0 |     0 |       0 |         1 |       0 |           1 |            1 |       0 |
|      2 | malce    |              0 |       1 |     0 |       0 |         0 |       0 |           1 |            0 |       0 |
|      4 | hamzk    |              0 |       0 |     0 |       0 |         0 |       1 |           0 |            1 |       0 |
|      5 | chinc    |              0 |       0 |     0 |       1 |         0 |       0 |           0 |            1 |       0 |
+--------+----------+----------------+---------+-------+---------+-----------+---------+-------------+--------------+---------+

到目前为止我在哪里。一切都按预期工作,直到我加入

SELECT
    E.CM_EV_BRANCH,
    E.CM_EV_EVUSERID,
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Unknown%' THEN 1 END) AS 'UnknownSource',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Walk%' THEN 1 END) AS 'Walk-in',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Phone%' THEN 1 END) AS 'Phone',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Digital%' THEN 1 END) AS 'Digital',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Retention%' THEN 1 END) AS 'Retention',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Service%' THEN 1 END) AS 'Service',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND S.VM_SO_NEWUSED = 'N' THEN 1 END) AS 'New Enquiry',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND S.VM_SO_NEWUSED = 'U' THEN 1 END) AS 'Used Enquiry',
    SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND S.VM_SO_NEWUSED <> 'U' AND S.VM_SO_NEWUSED <> 'N' THEN 1 END) AS 'Unknown'


FROM
    Datalake.dbo.CM_01_EVENT E
    LEFT JOIN Datalake.dbo.VM_01_SORDER S ON E.CM_EV_ENQUIRYNO = S.VM_SO_ENQUIRYNO

WHERE
    E.CM_EV_BRANCH <> 0 AND E.CM_EV_DEPTTYPE = 'S'
    
GROUP BY 
    E.CM_EV_BRANCH, E.CM_EV_EVUSERID

/*
HAVING SUM(CASE WHEN E.CM_EV_EVENTTYPE = 'SAS' AND E.CM_EV_REFERENC LIKE '%Unknown%' OR E.CM_EV_REFERENC LIKE '%Walk%' OR E.CM_EV_REFERENC LIKE '%Phone%' OR E.CM_EV_REFERENC LIKE '%Digital%' THEN 1 ELSE 0 END) <> 0
*/

ORDER BY 
    E.CM_EV_BRANCH, E.CM_EV_EVUSERID 

我已经注释掉了 HAVING 子句,因为它没有按预期工作。 DB 中存在给定分支存在 EVUSERID 但不符合 CASE 表达式中的条件的实例。这些将显示为“0”,这虽然是正确的,但我对在开发 SQL 语句期间看到它不感兴趣。

如有任何帮助,我们将不胜感激。

我想你想要一个 where 子句:这会过滤掉所有包含 0 的行,并让你简化子查询中的 case 表达式(因为一个条件对所有表达式都是通用的)。

另外:不要对列别名使用单引号!它们适用于文字字符串。使用不需要引号的别名 - 或者使用方括号来引用它们。

所以:

SELECT
    E.CM_EV_BRANCH,
    E.CM_EV_EVUSERID,
    SUM(CASE WHEN E.CM_EV_REFERENC LIKE '%Unknown%' THEN 1 ELSE 0 END) AS UnknownSource,
    SUM(CASE WHEN E.CM_EV_REFERENC LIKE '%Walk%' THEN 1 ELSE 0 END) AS Walk_in,
    SUM(CASE WHEN E.CM_EV_REFERENC LIKE '%Phone%' THEN 1 ELSE 0 END) AS Phone,
    SUM(CASE WHEN E.CM_EV_REFERENC LIKE '%Digital%' THEN 1 ELSE 0 END) AS Digital,
    SUM(CASE WHEN E.CM_EV_REFERENC LIKE '%Retention%' THEN 1 ELSE 0 END) AS Retention,
    SUM(CASE WHEN E.CM_EV_REFERENC LIKE '%Service%' THEN 1 ELSE 0 END) AS Service,
    SUM(CASE WHEN S.VM_SO_NEWUSED = 'N' THEN 1 ELSE 0 END) AS NewEnquiry,
    SUM(CASE WHEN S.VM_SO_NEWUSED = 'U' THEN 1 ELSE 0 END) AS Used Enquiry,
    SUM(S.VM_SO_NEWUSED NOT IN ('U', 'N') THEN 1 ELSE 0 END) AS Unknown
FROMDatalake.dbo.CM_01_EVENT E
LEFT JOIN Datalake.dbo.VM_01_SORDER S ON E.CM_EV_ENQUIRYNO = S.VM_SO_ENQUIRYNO
WHERE
    E.CM_EV_BRANCH <> 0 
    AND E.CM_EV_DEPTTYPE = 'S'
    AND E.CM_EV_EVENTTYPE = 'SAS' 
    AND (
        E.CM_EV_REFERENC LIKE '%Unknown%'
        OR E.CM_EV_REFERENC LIKE '%Walk%' 
        OR E.CM_EV_REFERENC LIKE '%Phone%'
        OR E.CM_EV_REFERENC LIKE '%Digital%'
        OR E.CM_EV_REFERENC LIKE '%Retention%'
        OR E.CM_EV_REFERENC LIKE '%Service%' 
    )
GROUP BY E.CM_EV_BRANCH, E.CM_EV_EVUSERID
ORDER BY E.CM_EV_BRANCH, E.CM_EV_EVUSERID