Как создать оператор SQL для следующего результата? - PullRequest
0 голосов
/ 02 марта 2019

У меня есть таблица со следующим содержимым -

Table

Я пытаюсь создать 4 столбца из этого, называемого следующим образом -

  • Risk
  • Risk_Count
  • Доход
  • Доход_Count

Следующий запрос SQL возвращает мне нужные 4 столбца, но также производитЗначения NULL.

select CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then BUCKET end as Revenue,
CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then CUSTOMER_COUNT end as Revenue_count,
 CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then BUCKET end as Risk,
  CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME"

Результат -

Output

Как удалить значения NULL и в идеале получить результаты в одной строкевывод должен содержать 3 строки с 4 столбцами.

С уважением

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Вы можете сделать это с помощью UNION:

select 
  'High Revenue' REVENUE,
  (select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'High Revenue') REVENUE_COUNT,
  'High Risk' RISK,
  (select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'High Risk') RISK_COUNT
union all
select 
  'Medium Revenue' REVENUE,
  (select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Medium Revenue') REVENUE_COUNT,
  'Medium Risk' RISK,
  (select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Medium Risk') RISK_COUNT
union all
select 
  'Low Revenue' REVENUE,
  (select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Low Revenue') REVENUE_COUNT,
  'Low Risk' RISK,
  (select CUSTOMER_COUNT from TABLE_NAME where BUCKET = 'Low Risk') RISK_COUNT

См. Демо MySql Смотрите Постресс демо

0 голосов
/ 02 марта 2019

Вы можете использовать агрегацию и max () для получения желаемых результатов, поскольку вы не можете использовать sum () для буквенно-цифровых полей - это вызовет ошибку.

select Revenue, Revenue_Count, Risk, Risk_Count from 
(
select 
     case 
          when bucket like 'High%' then 1
          when bucket like 'Low%' then 2
          else 3
     end, 
     max(case when bucket like '%Revenue%' then bucket else null end) as Revenue,
     max(case when bucket like '%Revenue%' then customer_count else null end) as Revenue_Count,
     max(case when bucket like '%Risk%' then bucket else null end) as Risk,
     max(case when bucket like '%Risk%' then customer_count else null end) as Risk_Count
 from public.table_name 
 group by 
    case 
       when bucket like 'High%' then 1
       when bucket like 'Low%' then 2
       else 3
    end
  order by 1    
) x;
0 голосов
/ 02 марта 2019

Вы хотите SUM() или MAX():

select MAX(CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then BUCKET end) as Revenue,
       MAX(CASE when "BUCKET"='High Revenue' OR "BUCKET"='Low Revenue' OR "BUCKET"='Medium Revenue' then CUSTOMER_COUNT end) as Revenue_count,
       MAX(CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk' then BUCKET end) as Risk,
       MAX(CASE when "BUCKET"='High Risk' OR "BUCKET"='Low Risk' OR "BUCKET"='Medium Risk') then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME"

Тогда вы можете упростить логику, используя IN или LIKE:

select max(case when "BUCKET" in ('High Revenue', 'Low Revenue', 'Medium Revenue') then BUCKET end) as Revenue,
       max(case when "BUCKET" in ('High Revenue', 'Low Revenue', 'Medium Revenue') then CUSTOMER_COUNT end) as Revenue_count,
       max(case when "BUCKET" in ('High Risk', 'Low Risk', 'Medium Risk') then BUCKET end) as Risk,
       max(case when "BUCKET" in ('High Risk', 'Low Risk', 'Medium Risk') then CUSTOMER_COUNT end as Risk_count
FROM "TABLE_NAME";

Я бы также посоветовалчтобы избавиться от двойных кавычек вокруг идентификаторов.Только заключайте в кавычки идентификаторы, когда вам действительно нужно - и затем выбирайте идентификаторы (например, те, которые у вас есть), которые не нужно заключать в кавычки.

РЕДАКТИРОВАТЬ:

Я думаю, что вы хотите:

select max(case when bucket like '%Revenue' then BUCKET end) as Revenue,
       max(case when bucket like '%Revenue' then CUSTOMER_COUNT end) as Revenue_count,
       max(case when bucket like '%Risk' then BUCKET end) as Risk,
       max(case when bucket like '%Risk' then CUSTOMER_COUNT end) as Risk_count
FROM "TABLE_NAME"
GROUP BY LEFT(bucket, 3)  -- sufficient to distinct high/medium/low
...