使用通配符计算案例表达式
Count case expression with wildcards
假设我有这个查询:
SELECT
(CASE
WHEN troublequeue LIKE '%DL%' THEN 'Distribution Line Crew'
WHEN troublequeue LIKE '%MS%' THEN 'Service Crew'
WHEN troublequeue LIKE '%TM%' THEN 'Troubleman'
WHEN troublequeue LIKE '%TT%' THEN 'Tree Crew'
WHEN troublequeue LIKE '%POLE%' THEN 'Pole Job'
WHEN troublequeue LIKE '%XFMR%' THEN 'Xfmr Job'
WHEN troublequeue LIKE '%TOC%' THEN 'Tennesee One Call'
ELSE 'Other' END) as HeldJobType,
COUNT(eventid)
FROM
electric_jobs
WHERE
BeginDateTime BETWEEN TO_DATE('<{[begin_date]}>', 'MM/DD/YYYY') AND TO_DATE('<{[end_date]}>', 'MM/DD/YYYY')
AND troublequeue IS NOT NULL
GROUP BY
(CASE
WHEN troublequeue LIKE '%DL%' THEN 'Distribution Line Crew'
WHEN troublequeue LIKE '%MS%' THEN 'Service Crew'
WHEN troublequeue LIKE '%TM%' THEN 'Troubleman'
WHEN troublequeue LIKE '%TT%' THEN 'Tree Crew'
WHEN troublequeue LIKE '%POLE%' THEN 'Pole Job'
WHEN troublequeue LIKE '%XFMR%' THEN 'Xfmr Job'
WHEN troublequeue LIKE '%TOC%' THEN 'Tennesee One Call'
ELSE 'Other' END)
ORDER BY
(CASE
WHEN troublequeue LIKE '%DL%' THEN 'Distribution Line Crew'
WHEN troublequeue LIKE '%MS%' THEN 'Service Crew'
WHEN troublequeue LIKE '%TM%' THEN 'Troubleman'
WHEN troublequeue LIKE '%TT%' THEN 'Tree Crew'
WHEN troublequeue LIKE '%POLE%' THEN 'Pole Job'
WHEN troublequeue LIKE '%XFMR%' THEN 'Xfmr Job'
WHEN troublequeue LIKE '%TOC%' THEN 'Tennesee One Call'
ELSE 'Other' END)
但是当我 运行 查询时,所有具有多个输入的字段都作为 DL 返回。即使在一个字段中有多个输入,我怎样才能让 SQL 每次出现这些情况时都给我一个计数?当有一个带有逗号和多个输入的字段时,问题就来了。
样本数据示例是
Troublequeue <- column name
1 TM
2 DL
3 DL
4 DL
5 AMI/STPR
6 PM
7 PM,CR
8 DL
9 TM
10 AMI/STPR
11 TM
12 AMI/STPR
13 AMI/STPR
14 PM
15 AMI/STPR
16 PM
17 MS
18 TOCY, TCN, TT, DL, POLE
如果我没理解错的话,你想要count(distinct)
:
count(distinct troublequeue)
这将 return 每行的不同值的数量。
您可能还想要:
min(troublequeue), max(troublequeue)
获取值示例。
请注意,许多数据库允许您使用:
group by HeldJobType
所有数据库都应允许:
order by HeldJobType;
您可以使用:
WITH trouble_ids ( id, HeldJobType ) AS (
SELECT 'DL', 'Distribution Line Crew' FROM DUAL UNION ALL
SELECT 'MS', 'Service Crew' FROM DUAL UNION ALL
SELECT 'TM', 'Troubleman' FROM DUAL UNION ALL
SELECT 'TT', 'Tree Crew' FROM DUAL UNION ALL
SELECT 'POLE', 'Pole Job' FROM DUAL UNION ALL
SELECT 'XFMR', 'Xfmr Job' FROM DUAL UNION ALL
SELECT 'TOC', 'Tennesee One Call' FROM DUAL
),
job_ids ( event_id, troublequeue, job_id, lvl, max_lvl ) AS (
SELECT event_id,
troublequeue,
REGEXP_SUBSTR( troublequeue, '[A-Z]+', 1, 1, 'i' ),
1,
REGEXP_COUNT( troublequeue, '[A-Z]+', 1, 'i' )
FROM electric_jobs
WHERE BeginDateTime BETWEEN DATE '2021-01-01' AND DATE '2021-02-01'
UNION ALL
SELECT event_id,
troublequeue,
REGEXP_SUBSTR( troublequeue, '[A-Z]+', 1, lvl + 1, 'i' ),
lvl + 1,
max_lvl
FROM job_ids
WHERE lvl < max_lvl
)
SELECT COALESCE( t.HeldJobType, 'Other' ) AS HeldJobType,
COUNT( e.event_id )
FROM job_ids e
LEFT OUTER JOIN trouble_ids t
ON ( e.job_id = t.id )
GROUP BY
COALESCE( t.HeldJobType, 'Other' );
其中,对于您的示例数据:
CREATE TABLE electric_jobs ( event_id, troublequeue ) AS
SELECT 1, 'TM' FROM DUAL UNION ALL
SELECT 2, 'DL' FROM DUAL UNION ALL
SELECT 3, 'DL' FROM DUAL UNION ALL
SELECT 4, 'DL' FROM DUAL UNION ALL
SELECT 5, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 6, 'PM' FROM DUAL UNION ALL
SELECT 7, 'PM,CR' FROM DUAL UNION ALL
SELECT 8, 'DL' FROM DUAL UNION ALL
SELECT 9, 'TM' FROM DUAL UNION ALL
SELECT 10, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 11, 'TM' FROM DUAL UNION ALL
SELECT 12, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 13, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 14, 'PM' FROM DUAL UNION ALL
SELECT 15, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 16, 'PM' FROM DUAL UNION ALL
SELECT 17, 'MS' FROM DUAL UNION ALL
SELECT 18, 'TOCY, TCN, TT, DL, POLE' FROM DUAL;
输出:
HELDJOBTYPE | COUNT(E.EVENT_ID)
:--------------------- | ----------------:
Distribution Line Crew | 5
Pole Job | 1
Other | 17
Tree Crew | 1
Service Crew | 1
Troubleman | 3
db<>fiddle here
假设我有这个查询:
SELECT
(CASE
WHEN troublequeue LIKE '%DL%' THEN 'Distribution Line Crew'
WHEN troublequeue LIKE '%MS%' THEN 'Service Crew'
WHEN troublequeue LIKE '%TM%' THEN 'Troubleman'
WHEN troublequeue LIKE '%TT%' THEN 'Tree Crew'
WHEN troublequeue LIKE '%POLE%' THEN 'Pole Job'
WHEN troublequeue LIKE '%XFMR%' THEN 'Xfmr Job'
WHEN troublequeue LIKE '%TOC%' THEN 'Tennesee One Call'
ELSE 'Other' END) as HeldJobType,
COUNT(eventid)
FROM
electric_jobs
WHERE
BeginDateTime BETWEEN TO_DATE('<{[begin_date]}>', 'MM/DD/YYYY') AND TO_DATE('<{[end_date]}>', 'MM/DD/YYYY')
AND troublequeue IS NOT NULL
GROUP BY
(CASE
WHEN troublequeue LIKE '%DL%' THEN 'Distribution Line Crew'
WHEN troublequeue LIKE '%MS%' THEN 'Service Crew'
WHEN troublequeue LIKE '%TM%' THEN 'Troubleman'
WHEN troublequeue LIKE '%TT%' THEN 'Tree Crew'
WHEN troublequeue LIKE '%POLE%' THEN 'Pole Job'
WHEN troublequeue LIKE '%XFMR%' THEN 'Xfmr Job'
WHEN troublequeue LIKE '%TOC%' THEN 'Tennesee One Call'
ELSE 'Other' END)
ORDER BY
(CASE
WHEN troublequeue LIKE '%DL%' THEN 'Distribution Line Crew'
WHEN troublequeue LIKE '%MS%' THEN 'Service Crew'
WHEN troublequeue LIKE '%TM%' THEN 'Troubleman'
WHEN troublequeue LIKE '%TT%' THEN 'Tree Crew'
WHEN troublequeue LIKE '%POLE%' THEN 'Pole Job'
WHEN troublequeue LIKE '%XFMR%' THEN 'Xfmr Job'
WHEN troublequeue LIKE '%TOC%' THEN 'Tennesee One Call'
ELSE 'Other' END)
但是当我 运行 查询时,所有具有多个输入的字段都作为 DL 返回。即使在一个字段中有多个输入,我怎样才能让 SQL 每次出现这些情况时都给我一个计数?当有一个带有逗号和多个输入的字段时,问题就来了。
样本数据示例是
Troublequeue <- column name
1 TM
2 DL
3 DL
4 DL
5 AMI/STPR
6 PM
7 PM,CR
8 DL
9 TM
10 AMI/STPR
11 TM
12 AMI/STPR
13 AMI/STPR
14 PM
15 AMI/STPR
16 PM
17 MS
18 TOCY, TCN, TT, DL, POLE
如果我没理解错的话,你想要count(distinct)
:
count(distinct troublequeue)
这将 return 每行的不同值的数量。
您可能还想要:
min(troublequeue), max(troublequeue)
获取值示例。
请注意,许多数据库允许您使用:
group by HeldJobType
所有数据库都应允许:
order by HeldJobType;
您可以使用:
WITH trouble_ids ( id, HeldJobType ) AS (
SELECT 'DL', 'Distribution Line Crew' FROM DUAL UNION ALL
SELECT 'MS', 'Service Crew' FROM DUAL UNION ALL
SELECT 'TM', 'Troubleman' FROM DUAL UNION ALL
SELECT 'TT', 'Tree Crew' FROM DUAL UNION ALL
SELECT 'POLE', 'Pole Job' FROM DUAL UNION ALL
SELECT 'XFMR', 'Xfmr Job' FROM DUAL UNION ALL
SELECT 'TOC', 'Tennesee One Call' FROM DUAL
),
job_ids ( event_id, troublequeue, job_id, lvl, max_lvl ) AS (
SELECT event_id,
troublequeue,
REGEXP_SUBSTR( troublequeue, '[A-Z]+', 1, 1, 'i' ),
1,
REGEXP_COUNT( troublequeue, '[A-Z]+', 1, 'i' )
FROM electric_jobs
WHERE BeginDateTime BETWEEN DATE '2021-01-01' AND DATE '2021-02-01'
UNION ALL
SELECT event_id,
troublequeue,
REGEXP_SUBSTR( troublequeue, '[A-Z]+', 1, lvl + 1, 'i' ),
lvl + 1,
max_lvl
FROM job_ids
WHERE lvl < max_lvl
)
SELECT COALESCE( t.HeldJobType, 'Other' ) AS HeldJobType,
COUNT( e.event_id )
FROM job_ids e
LEFT OUTER JOIN trouble_ids t
ON ( e.job_id = t.id )
GROUP BY
COALESCE( t.HeldJobType, 'Other' );
其中,对于您的示例数据:
CREATE TABLE electric_jobs ( event_id, troublequeue ) AS
SELECT 1, 'TM' FROM DUAL UNION ALL
SELECT 2, 'DL' FROM DUAL UNION ALL
SELECT 3, 'DL' FROM DUAL UNION ALL
SELECT 4, 'DL' FROM DUAL UNION ALL
SELECT 5, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 6, 'PM' FROM DUAL UNION ALL
SELECT 7, 'PM,CR' FROM DUAL UNION ALL
SELECT 8, 'DL' FROM DUAL UNION ALL
SELECT 9, 'TM' FROM DUAL UNION ALL
SELECT 10, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 11, 'TM' FROM DUAL UNION ALL
SELECT 12, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 13, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 14, 'PM' FROM DUAL UNION ALL
SELECT 15, 'AMI/STPR' FROM DUAL UNION ALL
SELECT 16, 'PM' FROM DUAL UNION ALL
SELECT 17, 'MS' FROM DUAL UNION ALL
SELECT 18, 'TOCY, TCN, TT, DL, POLE' FROM DUAL;
输出:
HELDJOBTYPE | COUNT(E.EVENT_ID) :--------------------- | ----------------: Distribution Line Crew | 5 Pole Job | 1 Other | 17 Tree Crew | 1 Service Crew | 1 Troubleman | 3
db<>fiddle here