2015-05-21 5 views
0

Я использую MySQL и пытается сортировать/присоединяться к таблице с несколькими строками данных, чтобы каждый год данных представлялся в соседних столбцах, а если данных нет , он представляется как null.MYSQL: Объединить строки как столбцы

+------+------+-----------+ | code | year | enquiries | +------+------+-----------+ | 1 | 2012 | 302 | | 2 | 2012 | 274 | | 3 | 2012 | 288 | | 4 | 2012 | 301 | | 5 | 2012 | 192 | | 1 | 2013 | 406 | | 3 | 2013 | 297 | | 4 | 2013 | 199 | | 1 | 2014 | 254 | | 2 | 2014 | 396 | | 3 | 2014 | 187 | | 4 | 2014 | 213 | | 5 | 2014 | 316 | | 6 | 2014 | 222 | +------+------+-----------+

так, что приведенная выше таблица будет выглядеть следующим образом:

+------+------+-----------+------+-----------+------+-----------+ | code | year | enquiries | year | enquiries | year | enquiries | +------+------+-----------+------+-----------+------+-----------+ | 1 | 2012 | 302 | 2013 | 406 | 2014 | 254 | | 2 | 2012 | 274 | NULL | NULL | NULL | NULL | | 3 | 2012 | 288 | 2013 | 297 | 2014 | 187 | | 4 | 2012 | 301 | 2013 | 199 | 2014 | 213 | | 5 | 2012 | 192 | NULL | NULL | 2014 | 316 | | 6 | NULL | NULL | NULL | NULL | 2014 | 222 | +------+------+-----------+------+-----------+------+-----------+

Я думаю, что я должен искать это полное внешнее соединение, но это ISN» возможно использование MySQL.

Мне удалось получить его, чтобы объединить несколько строк вместе, используя несколько LEFT OUTER JOINS, но это опускает любые строки, где данные отсутствуют на все 3 года.

+2

Не могли бы вы добавить SQLFiddle? Спасибо –

+0

перед таблицей: http://sqlfiddle.com/#!9/c9be0/1, после таблицы: http: //sqlfiddle.com/#! 9/df1e2/1 – n8udd

ответ

1

Для ограниченного числа записей, которые показали, вы можете написать простое решение поворота, как показано ниже.

Но, если количество лет увеличивается, вы должны сгенерировать это время выполнения запроса и выполнить.

mysql> select 
    ->  code 
    ->  , max(case when year=2012 then year end) as y2012 
    ->  , max(case when year=2012 then enquiries end) as enq_2012 
    ->  , max(case when year=2013 then year end) as y2013 
    ->  , max(case when year=2013 then enquiries end) as enq_2013 
    ->  , max(case when year=2014 then year end) as y2014 
    ->  , max(case when year=2014 then enquiries end) as enq_2014 
    -> from so_20150521.so_q30374911 
    -> group by code 
    -> order by code; 
+------+-------+----------+-------+----------+-------+----------+ 
| code | y2012 | enq_2012 | y2013 | enq_2013 | y2014 | enq_2014 | 
+------+-------+----------+-------+----------+-------+----------+ 
| 1 | 2012 |  302 | 2013 |  406 | 2014 |  254 | 
| 2 | 2012 |  274 | NULL |  NULL | 2014 |  396 | 
| 3 | 2012 |  288 | 2013 |  297 | 2014 |  187 | 
| 4 | 2012 |  301 | 2013 |  199 | 2014 |  213 | 
| 5 | 2012 |  192 | NULL |  NULL | 2014 |  316 | 
| 6 | NULL |  NULL | NULL |  NULL | 2014 |  222 | 
+------+-------+----------+-------+----------+-------+----------+ 
6 rows in set (0.02 sec) 

Demo на SQL Fiddle в http://sqlfiddle.com/#!9/4a46d/2

Дальнейшее упрощение может быть:

mysql> select 
    ->  code 
    ->  , max(case when year=2012 then enquiries end) as enq_2012 
    ->  , max(case when year=2013 then enquiries end) as enq_2013 
    ->  , max(case when year=2014 then enquiries end) as enq_2014 
    -> from so_20150521.so_q30374911 
    -> group by code 
    -> order by code; 
+------+----------+----------+----------+ 
| code | enq_2012 | enq_2013 | enq_2014 | 
+------+----------+----------+----------+ 
| 1 |  302 |  406 |  254 | 
| 2 |  274 |  NULL |  396 | 
| 3 |  288 |  297 |  187 | 
| 4 |  301 |  199 |  213 | 
| 5 |  192 |  NULL |  316 | 
| 6 |  NULL |  NULL |  222 | 
+------+----------+----------+----------+ 
6 rows in set (0.00 sec) 
+0

Это было именно то, что я был после. Благодаря! – n8udd

0

Попробуйте это:

(SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id) UNION (SELECT * FROM t1 RIGHT JOIN t2 ON t1.id = t2.id)