Как повернуть / повернуть таблицу, чтобы каждая строка стала набором столбцов в новой таблице? - PullRequest
0 голосов
/ 25 октября 2011

Я должен сказать, что этот вопрос сложно сформулировать.

Итак, вот что у меня есть - таблица (TAX_A, TAX_B ... не являются константами; количество записей практически ограничено 4, но может быть не меньше ни одного, и в этом случае 8 столбцов должны иметь NULL значения):

tax_name        tax_amount
TAX_A              58.39 
TAX_B              151.81
TAX_C              78.00 
...

и вот так должен выглядеть конечный результат:

tax_name1  tax_amount1  tax_name2  tax_amount2  tax_name2  tax_amount2
    TAX_A      58.39        TAX_B      151.81       TAX_C      78.00

Сначала я думал об использовании PIVOT, но потом я не уверен, что делать со вторым столбцом, так как я хочу переместить значения в парах (имя, сумма).

Пожалуйста, посоветуйте. Как это можно сделать в SQL?

1 Ответ

1 голос
/ 25 октября 2011

Это называется поворот таблицы. Вам нужно знать количество столбцов в наборе результатов.

Учитывая вашу таблицу спецификаций, будет работать следующее:

select tax_name1 = t1.tax_name , tax_amount1 = t1.tax_amount ,
       tax_name2 = t2.tax_name , tax_amount2 = t2.tax_amount ,
       tax_name3 = t3.tax_name , tax_amount3 = t3.tax_amount ,
       tax_name4 = t4.tax_name , tax_amount4 = t4.tax_amount
from      foo  t1
full join foo  t2 on t2.tax_name = 'TAX_B'
full join foo  t3 on t3.tax_name = 'TAX_C'
full join foo  t4 on t4.tax_name = 'TAX_D'
where t1.tax_name = 'TAX_A'

В более "реальном мире" сценарий первой таблицей должен был бы выбрать отдельный набор идентификаторов для строк, которые вы хотите в наборе результатов, а затем выполнить левое самостоятельное объединение для каждой "итерации", что-то вроде:

select t.id ,
       tax_name1 = t1.tax_name , tax_amount1 = t1.tax_amount ,
       tax_name2 = t2.tax_name , tax_amount2 = t2.tax_amount ,
       tax_name3 = t3.tax_name , tax_amount3 = t3.tax_amount ,
       tax_name4 = t4.tax_name , tax_amount4 = t4.tax_amount
from (select distinct id from foo ) t
left join foo  t1 on t1.id = t.id and t1.tax_name = 'TAX_A'
left join foo  t2 on t2.id = t.id and t2.tax_name = 'TAX_B'
left join foo  t3 on t3.id = t.id and t3.tax_name = 'TAX_C'
left join foo  t4 on t4.id = t.id and t4.tax_name = 'TAX_D'

ура!

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