Как создать инструкцию SQL для следующего результата?

#sql #database #hana

#sql #База данных #hana

Вопрос:

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

Таблица

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

  • Риск
  • Risk_Count
  • Доход
  • Доход_count

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

 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"
  

Результат —

Вывод

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

С уважением

Ответ №1:

Вы хотите 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
  

Комментарии:

1. Привет, в итоге возникла следующая ошибка — ` несовместимый тип данных: для функции SUM / AVG / STDDEV / VAR доступен только числовой тип: `

2. @BoudhayanDev . . . Ваши значения выглядят как числа. Если это строки, вы должны использовать max() или min() .

3. Я использовал max, и он напечатал строку со средним доходом и средним риском, по понятным причинам, потому что это строка с наибольшим значением

4. @BoudhayanDev . . . Теперь я лучше понимаю, чего вы хотите. Я добавил другой подход.

5. Спасибо. Это именно то, чего я хотел. Однако не могли бы вы объяснить, что делает LEFT (bucket, 3)?

Ответ №2:

Вы можете использовать aggregation и 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;
  

Комментарии:

1. Столкнувшись с этой ошибкой r- Не удалось выполнить ‘выбрать доход, Revenue_Count, риск, Risk_Count из ( выберите случай, когда «Bucket» похож на «High%», тогда …’ SAP DBTech JDBC: [260]: недопустимое имя столбца: Bucket: строка 5 col 16 (на позиции 94)

2. Я запустил это в PostgreSQL, который требовал кавычек в именах полей. Удалите их, и все будет в порядке.

3. Исправлена проблема с именами полей, заключенными в кавычки. Похоже, это происходит в PostgreSQL, если вы используете заглавные буквы. Я переименовал поля в нижний регистр и удалил кавычки.

4. Я не использую Postgres. Вместо этого Hana. и кавычки не имеют значения

Ответ №3:

Вы можете сделать это с помощью 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
Смотрите демонстрацию Postgress

Комментарии:

1. во-первых, вы пропустили — from ИМЯ_ТАБЛИЦЫ перед объединением всех инструкций. и, во-вторых, даже после применения изменений не отображается желаемый результат. Вместо этого он показывает 0 строк

2. Я только что отредактировал с помощью демо, проверьте это. Вам не нужно from TABLE_NAME .

3. Не удалось выполнить ‘select ‘High Revenue’ ДОХОД, (выберите CUSTOMER_COUNT из ИМЯ_ТАБЛИЦЫ, где …’ SAP DBTech JDBC: [257]: ошибка синтаксиса sql: неправильный синтаксис рядом с «union»: строка 6 col 1 (на позиции 269)

4. Приведенный выше код работает как для MySQL, так и для Postgress. Где вы выполняете этот код?

5. Использование HANA sql .