Pivot / Crosstab Query в Oracle 10g (номер динамического столбца) - PullRequest
3 голосов
/ 13 августа 2010

У меня есть этот вид таблицы

UserName      Product     NumberPurchaces
--------      -------     ---------------
'John Doe'    'Chair'     4
'John Doe'    'Table'     1
'Jane Doe'    'Table'     2
'Jane Doe'    'Bed'       1

Как я могу создать запрос, который предоставит это сводное представление в Oracle 10g?

 UserName   Chair   Table   Bed
 --------   -----   -----   ---
 John Doe   4       1       0
 Jane Doe   0       2       1

Есть ли способ сделать это динамически? Я видел так много подходов (декодирование, циклы PL / SQL, объединения, 11g pivot)

Но я еще не нашел что-то, что будет работать для меня на основе приведенного выше примера


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

Ответы [ 2 ]

4 голосов
/ 13 августа 2010

Oracle 11g первым поддерживает PIVOT / UNPIVOT, поэтому вы должны использовать:

  SELECT t.username,
         MAX(CASE WHEN t.product = 'Chair' THEN t.numberpurchases ELSE NULL END) AS chair,
         MAX(CASE WHEN t.product = 'Table' THEN t.numberpurchases ELSE NULL END) AS tbl,
         MAX(CASE WHEN t.product = 'Bed' THEN t.numberpurchases ELSE NULL END) AS bed
    FROM TABLE t
GROUP BY t.username

Вы можете использовать DECODE, но CASE поддерживается с 9i.

3 голосов
/ 03 сентября 2010

Полагаю, нужно было бы написать код для динамического создания запроса.Каждая строка MAX () идентична за исключением строк 'CHAIR', 'TABLE' и т. Д., Строк.

Таким образом, необходимо пройти через данные, чтобы найти все продукты и создать второй запрос какодин идет.Затем выполните этот динамически построенный запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...