2016-12-16 3 views
2

У меня возникла проблема с созданием запроса с использованием точки опоры. У меня есть таблица, в которой есть 4 колонкиoracle sql pivot группирует мои данные

col1 | col2 | col3 | col4 
1 | 1 | 5 | 2 
1 | 2 | 6 | 2 
1 | 3 | 7 | 2 
1 | 4 | 8 | 2 
1 | 1 | 5 | 2 
1 | 2 | 6 | 2 
1 | 3 | 7 | 2 
1 | 4 | 8 | 2 

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

col1 | col2 | col3 

Вот запрос:

select col1, "1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24" 
from (
    select col1, col2, col3 
    from tbl 
    where col4 = 2 
) 
pivot 
(
    max(col2) 
    for col3 
    in (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24) 
) 

код работает все время excepct, когда у меня есть две одинаковые записи в базе данных. Затем он группируется и отображается как один. Я хотел бы выводить его как две отдельные, но одинаковые строки. Самое простое исправление, которое я вижу, это то, что я включаю еще один столбец в таблице, который будет работать как идентификатор. Но поскольку я не буду использовать этот идентификатор где-нибудь еще, я думаю, что это бесполезно, и было бы проще и меньше работать, чтобы немного изменить код.

Код выше выдает следующее:

1 5 6 7 8 9 

, и я хотел бы это:

1 5 6 7 8 9 
1 5 6 7 8 9 
+0

Вы правы; вам понадобится дополнительный столбец для определения подмножеств данных. Это может быть просто row_number(), который вы используете для группировки всех строк в «первую строку значений (col1, col2, col3), вторую строку значений (col1, col2, col3) и т. Д.» – Boneist

+0

Пожалуйста, выберите одна СУБД (Sql Server или Oracle) или ваш вопрос действителен для любого из них? –

+0

@Boneist Да похоже, что это лучшая идея. – Kristjan

ответ

0

Добавить еще один столбец, используя ROW_NUMBER() аналитическую функцию:

SELECT * 
FROM (SELECT t.*, 
       ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 
            ORDER BY ROWNUM) AS rn 
     FROM tbl t) 
PIVOT (MAX(Col2) FOR Col3 IN (1,2,3,4,5,6,7,8,9,10 /* ..., 24*/)); 

Выход

COL1 COL4 RN 1 2 3 4 5 6 7 8 9 10 
---- ---- -- - - - - - - - - - -- 
    1 2 1   1 2 3 4 
    1 2 2   1 2 3 4 
+0

спасибо за ваш ответ. Я решил проблему, добавив еще один столбец в таблицу, которая работает как идентификатор. и тогда мое решение работает. Спасибо, в любом случае – Kristjan

Смежные вопросы