Нужен запрос в оракуле с использованием group by и подсчет для ниже - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть таблица, подобная приведенной ниже.

12-APR-19 06.48.08.883000 PM,AWSA
12-APR-19 06.48.41.208000 PM,
12-APR-19 07.24.55.697334 PM,ER
11-APR-19 08.58.34.835000 AM,AWSA
10-APR-19 08.10.38.675052 PM,ER
19-APR-19 09.48.14.597000 AM,

......... * * 1004

Пробовал следующий запрос.

SELECT TO_CHAR(register_date,'DD-MON-YY') || ',' || 
   reg_type || ',' || COUNT(*)
FROM po_ta_oam_customer
WHERE register_date >= '01-APR-19' AND register_date < '08-APR-19'
GROUP BY TO_CHAR(register_date,'DD-MON-YY'),
         reg_type
ORDER BY TO_CHAR(register_date,'DD-MON-YY');

Я получаю результат, как показано ниже.

 1-Apr-19   AWSA    1222
 1-Apr-19   ER  34
 1-Apr-19       2556
 2-Apr-19   AWSA    1062
 2-Apr-19   ER  22
 2-Apr-19       2431
 3-Apr-19   AWSA    1037
 3-Apr-19   ER  33
 3-Apr-19       2521
 4-Apr-19   AWSA    920
 4-Apr-19   ER  36
 4-Apr-19       2359
 5-Apr-19   AWSA    832
 5-Apr-19   ER  20
 5-Apr-19       2091
 6-Apr-19   AWSA    476
 6-Apr-19   ER  18
 6-Apr-19       1673
 7-Apr-19   AWSA    50
 7-Apr-19   ER  15
 7-Apr-19       1555

Но я пытаюсь получить результат следующим образом.

   Date     AWSA    ER  Blanks
 1-Apr-19   1222    34  2556
 2-Apr-19   1062    22  2431
 3-Apr-19   1037    33  2521
 4-Apr-19   920     36  2359
 5-Apr-19   832     20  2091
 6-Apr-19   476     18  1673
 7-Apr-19   50      15  1555

Ответы [ 2 ]

0 голосов
/ 14 апреля 2019

Это действительно вариант ответа Барбароса. Но я рекомендую:

SELECT TO_CHAR(register_date, 'DD-MON-YY') as "Date",
       SUM(CASE WHEN reg_type = 'AWSA' THEN 1 ELSE 0 END ) as AWSA,
       SUM(CASE WHEN reg_type = 'ER' THEN 1 ELSE 0 END) as ER,
       SUM(CASE WHEN TRIM(reg_type) IS NULL THEN 1 ELSE 0 END) as Blank
FROM po_ta_oam_customer
WHERE register_date >= DATE '2019-04-01' AND
      register_date < DATE '2019-04-08'
GROUP BY TO_CHAR(register_date, 'DD-MON-YY')             
ORDER BY MAX(register_date);

Примечания:

  • Константы даты вводятся как константы даты, а не как строки. Oracle поддерживает это и делает запрос более понятным.
  • Все данные за 7 апреля включены.
  • ORDER BY будет работать в течение периодов, охватывающих более одного месяца.
  • Расчет Blank работает для любого количества пробелов или значения NULL.
0 голосов
/ 14 апреля 2019

Вы можете использовать conditional aggregation

SELECT TO_CHAR(register_date,'DD-MON-YY')              as "Date",
       COUNT( CASE WHEN reg_type = 'AWSA' THEN 1 END ) as AWSA,
       COUNT( CASE WHEN reg_type = 'ER'   THEN 1 END ) as ER,
       COUNT( CASE WHEN reg_type = '  '   THEN 1 END ) as "Blank"
  FROM po_ta_oam_customer
 WHERE register_date BETWEEN '01-APR-19' AND '07-APR-19'
 GROUP BY TO_CHAR(register_date,'DD-MON-YY')             
 ORDER BY "Date";

P.S. Я не уверен насчет длины пробелов в сортировке reg_type = ' ', которая строит столбец "Blank", похоже, имеет 2 символа. Длина и я оставил как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...