#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 .