SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.02.2011 11:05:05

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Вывод данных из одной колонки в несколько

Здравствуйте.
Имеется таблица такого вида:


SELECT * FROM report WHERE rival_id=8 AND indicator_id >=88 AND indicator_id <= 89;



    id    period_num    rival_id    indicator_id    market_id    product_id    misc_id        znach
    178    1        8    88                                195000
    179    1        8    89                                120752
    803    2        8    88                                195000
    804    2        8    89                                116770
    1428    3        8    88                                195000
    1429    3        8    89                                125371
    2053    4        8    88                                195000
    2054    4        8    89                                117434
    2678    5        8    88                                210000
    2679    5        8    89                                120930
    3303    6        8    88                                385000
    3304    6        8    89                                81393
    3928    7        8    88                                372000
    3929    7        8    89                                98052
    4553    8        8    88                                372000
    4554    8        8    89                                102285
    5178    9        8    88                                521000
    5179    9        8    89                                107870
 


Требуется вывести данные из колонки znach в несколько колонок, по одной на каждый период. Написал следующее:

SELECT
(CASE period_num WHEN 1 THEN znach ELSE null END) AS 'per1',
(CASE period_num WHEN 2 THEN znach ELSE null END) AS 'per2',
(CASE period_num WHEN 3 THEN znach ELSE null END) AS 'per3',
(CASE period_num WHEN 4 THEN znach ELSE null END) AS 'per4',
(CASE period_num WHEN 5 THEN znach ELSE null END) AS 'per5',
(CASE period_num WHEN 6 THEN znach ELSE null END) AS 'per6',
(CASE period_num WHEN 7 THEN znach ELSE null END) AS 'per7',
(CASE period_num WHEN 8 THEN znach ELSE null END) AS 'per8',
(CASE period_num WHEN 9 THEN znach ELSE null END) AS 'per9'
FROM report
WHERE rival_id=8 AND indicator_id >=88 AND indicator_id <= 89;
 


Выводит:

    per1    per2    per3    per4    per5    per6    per7    per8    per9
    195000                                
    120752                                
        195000                            
        116770                            
            195000                        
            125371                        
                195000                    
                117434                    
                    210000                
                    120930                
                        385000            
                        81393            
                            372000        
                            98052        
                                372000    
                                102285    
                                    521000
                                    107870
 

а требуется получить:

    per1    per2    per3    per4    per5    per6    per7    per8    per9
    195000    195000 195000    195000     210000    385000 372000 372000 521000
    120752    116770    125371    117434    120930 81393    98052 102285 107870
 


Помогите с этим, пожалуйста

Неактивен

 

#2 25.02.2011 11:30:44

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вывод данных из одной колонки в несколько

Обычно требуется вывести одну строку, и тогда можно просто сгруппировать
и написать SUM() над соответствующими столбцами. Здесь же Вам нужно еще
придумать способ отделения строк друг от друга. Кажется, rival_id подойдет.
Т.е. что-то такого типа:

SELECT SUM(IF(period_num=1,znach,0)) AS p1, ...
FROM report
WHERE ...
GROUP BY rival_id.

Неактивен

 

#3 25.02.2011 14:13:20

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Вывод данных из одной колонки в несколько

Извините, не сообщил этого ранее. Но решение нужно для SQlite. Просто не думал, что будут такие отличия в синтаксисе от MySQL. В SQlite нет IF ((
Там проверка условия с помощью CASE делается

Неактивен

 

#4 25.02.2011 15:36:03

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Вывод данных из одной колонки в несколько

Форум по MySQL wink

Ну, сделайте через CASE, писать чуть длиннее просто.

Неактивен

 

#5 26.02.2011 03:10:41

Latoid
Участник
Зарегистрирован: 18.07.2010
Сообщений: 12

Re: Вывод данных из одной колонки в несколько

Да, вы правы, спасибо большое. Окончательно решил так:


SELECT
indicator_id,
SUM (CASE period_num WHEN 1 THEN znach ELSE null END) AS 'per1',
SUM (CASE period_num WHEN 2 THEN znach ELSE null END) AS 'per2',
SUM (CASE period_num WHEN 3 THEN znach ELSE null END) AS 'per3',
SUM (CASE period_num WHEN 4 THEN znach ELSE null END) AS 'per4',
SUM (CASE period_num WHEN 5 THEN znach ELSE null END) AS 'per5',
SUM (CASE period_num WHEN 6 THEN znach ELSE null END) AS 'per6',
SUM (CASE period_num WHEN 7 THEN znach ELSE null END) AS 'per7',
SUM (CASE period_num WHEN 8 THEN znach ELSE null END) AS 'per8',
SUM (CASE period_num WHEN 9 THEN znach ELSE null END) AS 'per9'
FROM report WHERE rival_id=8 AND indicator_id >=88 AND indicator_id <=89
GROUP BY indicator_id;
 

Отредактированно Latoid (26.02.2011 03:11:32)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson