Используйте 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 ]

0 голосов
/ 17 ноября 2009

Как насчет этого:

select 'Current' As TimePeriod,
sum(case when CPT_ORIGINATED > SUBDATE(DATE(NOW()),30) THEN 1 else 0
    end) as CountOfThings,
from `cpt-prod`
where CPT_STATE <> 'Closed'
UNION ALL
SELECT 'Past1' AS TimePeriod,
sum(case when CPT_ORIGINATED > SUBDATE(DATE(NOW()),60) AND CPT_ORIGINATED < SUBDATE(DATE(NOW()),30) THEN 1 else     0
    end) as CountOfThings,
from `cpt-prod`
where CPT_STATE <> 'Closed'

и так далее для каждой строки?

0 голосов
/ 17 ноября 2009

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

CREATE TABLE results (cur NUMBER, past1 number, past2 NUMBER, past3 NUMBER, past4 NUMBER);
INSERT INTO results VALUES(200,600,800,0,88);

SELECT NAME, val
FROM 
(SELECT 'current' NAME, cur val FROM results)
UNION ALL
(SELECT 'past1' NAME, past1 val FROM results)
UNION ALL
(SELECT 'past2' NAME, past2 val FROM results)
UNION ALL
(SELECT 'past3' NAME, past3 val FROM results)
UNION ALL
(SELECT 'past4' NAME, past4 val FROM results)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...