来自多个表的 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
我正在尝试编写一个 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