#sql #bash #csv
#sql #bash #csv
Вопрос:
Моя проблема довольно проста, но я застрял на ней на 2 недели и не могу отступить назад и увидеть возможное решение.
У меня есть результат sql-запроса, который выглядит следующим образом :
USR Count DATE
u1 9 160920
U1 2 160918
U1 5 160922
U2 19 160924
U3 2 160919
U3 1 160921
U4 12 160921
И я хочу преобразовать этот результат в формат csv, чтобы он выглядел так, как при использовании BASH из-за ограничений на работающем сервере :
;160918;160919;160920;160921;160922;160923;160924
U1; 2; 0; 9; 0; 5; 0; 0
U2; 0; 0; 0; 0; 0; 0; 19
U3; 0; 2; 0; 1; 0; 0; 0
U4; 0; 0; 0; 12; 0; 0; 0
Я застрял, мне удалось преобразовать строку в формат csv, но когда я пытаюсь перегруппировать дублирующегося пользователя в одной строке, я терплю неудачу.
У вас есть какие-либо советы или идеи?
Комментарии:
1. Вы выполняете sql-запрос самостоятельно? Можете ли вы использовать OUTFILE (mysql) или эквиваленты?
2. Вы можете использовать SQL Spool для получения результата
3. Я уже говорил ранее: я не понимаю, как вы переходите от ввода (результата вашего запроса) к предполагаемому результату. Какие правила вы применяете для этого, когда делаете это вручную?
4. @Sven, логика — это простой свод, где вы устанавливаете a
0
в несуществующие значения. Я предполагаю, что есть датыYYMMDD
и количество чего-то. У U1 есть a9
20 сентября, a2
18 сентября и 5 22 сентября и так далее…5. Дайте мне знать, если это поможет!!
Ответ №1:
SELECT Z.Col1 AS " ",
MAX( CASE WHEN Z.Col3 = 160918 THEN Z.Col2 ELSE 0 END ) "160918",
MAX( CASE WHEN Z.Col3 = 160919 THEN Z.Col2 ELSE 0 END ) "160919",
MAX( CASE WHEN Z.Col3 = 160920 THEN Z.Col2 ELSE 0 END ) "160920",
MAX( CASE WHEN Z.Col3 = 160921 THEN Z.Col2 ELSE 0 END ) "160921",
MAX( CASE WHEN Z.Col3 = 160922 THEN Z.Col2 ELSE 0 END ) "160922",
MAX( CASE WHEN Z.Col3 = 160923 THEN Z.Col2 ELSE 0 END ) "160923",
MAX( CASE WHEN Z.Col3 = 160924 THEN Z.Col2 ELSE 0 END ) "160924"
FROM
(
SELECT *
FROM
( SELECT 'u1' AS Col1, 9 AS Col2, 160920 AS Col3) UNION ALL
( SELECT 'u1' AS Col1, 2 AS Col2, 160918 AS Col3) UNION ALL
( SELECT 'u2' AS Col1, 19 AS Col2, 160924 AS Col3) UNION ALL
( SELECT 'u3' AS Col1, 2 AS Col2, 160919 AS Col3) UNION ALL
( SELECT 'u4' AS Col1, 1 AS Col2, 160921 AS Col3) UNION ALL
( SELECT 'u4' AS Col1, 12 AS Col2, 160921 AS Col3)
) Z
GROUP BY Z.Col1
ORDER BY Z.Col1
;
Комментарии:
1. С небольшой настройкой результат был именно таким, как я хотел. Большое спасибо, Teja!