Как преобразовать результат sql-запроса в формат csv

#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 есть a 9 20 сентября, a 2 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!