简体   繁体   English

使用通配符计数 case 表达式

[英]Count case expression with wildcards

Suppose I have this query:假设我有这个查询:

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)

but when I run the query, all of the fields that have multiple inputs get returned as DL.但是当我运行查询时,所有具有多个输入的字段都会作为 DL 返回。 How can I get SQL to give me a count of each time one of these occur, even if there are multiple inputs in one field?即使一个字段中有多个输入,我如何才能让 SQL 每次发生其中一个时给我一个计数? The issues come when there is a field with a comma and multiple inputs.当有一个带有逗号和多个输入的字段时,问题就出现了。

Sample data example is样本数据示例是

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

If I understand correctly, you want count(distinct) :如果我理解正确,你想要count(distinct)

count(distinct troublequeue)

This will return the number of distinct values for each row.这将返回每行的不同值的数量。

You might also want:您可能还想要:

min(troublequeue), max(troublequeue)

to get examples of values.获取值的示例。

Note that many databases would allow you to use:请注意,许多数据库允许您使用:

group by HeldJobType

All databases should allow:所有数据库都应允许:

order by HeldJobType;

You can use:您可以使用:

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' );

Which, for your sample data:其中,对于您的示例数据:

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;

Outputs:输出:

 HELDJOBTYPE |手持式 | COUNT(E.EVENT_ID):--------------------- |计数(E.EVENT_ID):---------- | ----------------: Distribution Line Crew | ----------------: 配电线船员 | 5 Pole Job | 5 极工作 | 1 Other | 1 其他 | 17 Tree Crew | 17 树队 | 1 Service Crew | 1 服务人员 | 1 Troubleman | 1 麻烦人 | 3 3

db<>fiddle here db<> 在这里摆弄

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

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