Используйте Select или PL SQL для транспонирования - PullRequest
0 голосов
/ 17 ноября 2009

У меня есть запрос на выборку в MySQL, показанный ниже: Этот запрос выполняется и выдает результаты в виде таблицы

Current | Past1  | Past2  | Past 3  |  Past4
   200     600      800      000         88

Я бы хотел перенести эти результаты, чтобы получить информацию в форме: Поэтому я хотел бы, чтобы результаты были (транспонированы)

Current    200
Past1      600
Past2      800
Past3      000
Past4       88

Можно ли это сделать с помощью оператора SQL в oracle или мне нужна процедура PL SQL для этого. Если PL SQL может предоставить примерную ссылку на него.

select
sum(case
    when CPT_ORIGINATED > SUBDATE(DATE(NOW()),30) THEN 1 else 0
    end) as Current,
sum(case
    when CPT_ORIGINATED > SUBDATE(DATE(NOW()),60) AND CPT_ORIGINATED < SUBDATE(DATE(NOW()),30) THEN 1 else 0
    end) as Past1,
sum(case
    when CPT_ORIGINATED > SUBDATE(DATE(NOW()),90) AND CPT_ORIGINATED < SUBDATE(DATE(NOW()),60) THEN 1 else 0
    end) as Past2,
sum(case
    when CPT_ORIGINATED > SUBDATE(DATE(NOW()),120) AND CPT_ORIGINATED < SUBDATE(DATE(NOW()),90) THEN 1 else 0
    end) as Past3,
sum(case
    when CPT_ORIGINATED > SUBDATE(DATE(NOW()),150) AND CPT_ORIGINATED < SUBDATE(DATE(NOW()),120) THEN 1 else 0
    end) as Past4
from `cpt-prod`
where CPT_STATE <> 'Closed'

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

Я бы сделал ваш запрос по-другому, чтобы данные выходили так, как вы хотите.

  1. Создайте таблицу (например, возраст) для определения интервалов (name, lowerBound, upperBound)
    Если вы хотите получить фантазию, все, что вам нужно, это «значения границ», и соответствующая верхняя граница может быть построена с помощью самостоятельного соединения.
  2. Затем используйте эту таблицу и присоедините ее к вашей таблице "фактов":

(Не могу понять, как правильно отформатировать следующих государственных деятелей, чтобы они отображались как код без этой строки ...)

SELECT name, COUNT(*)
FROM cpt-prod JOIN Ages on cpt_originated 
    between Subdate(now - upperBound) And Subdate (now - lowerBound)
GROUP BY name

В зависимости от ваших потребностей и базы данных, вы можете определить таблицу Ages в фактическом операторе SQL. (AFAIK, это не может быть сделано в Oracle, но, возможно, кто-то может добавить комментарий о том, как сделать это в MySQL).

1 голос
/ 17 ноября 2009

Один из способов сделать это - объединение:

WITH YourWith as (
    select value1, value2, value3, ...
    from YourTable
)
select name = 'Current', value1 from YourWith
union all
select name = 'Past1', value2 from YourWith
union all
select name = 'Past2', value3 from YourWith
union all
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...