2009-11-17 6 views
0

J'ai une requête de sélection dans MySQL indiqué ci-dessous: Cette requête exécute et produit des résultats sous la forme d'une tableSélectionnez Utiliser ou PL SQL pour Transposer

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

Je voudrais transposer ces résultats pour obtenir des informations sous la forme: Je voudrais donc les reults à (transposés)

Current 200 
Past1  600 
Past2  800 
Past3  000 
Past4  88 

peut-il être fait en utilisant une instruction SQL dans l'oracle ou ai-je besoin d'une procédure PL SQL pour cela. Si un SQL PL peut vous fournir quelques exemples de référence.

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' 
+1

Oracle ou MySQL - c'est quoi? En outre, jetez un oeil à la markdown pour formater votre instruction SQL afin qu'elle soit lisible. –

Répondre

1

Une façon de faire est une union:

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 
... 
+0

Allons, c'est un peu de la triche, n'est-ce pas? ;-) – Thorsten

1

Je ferais votre requête d'une manière différente de sorte que les données qui sort la façon dont vous voulez.

  1. Créer une table (par exemple, âge) pour définir vos intervalles (nom, lowerBound, upperBound)
    Si vous voulez obtenir la fantaisie, tout ce que vous avez besoin est les « valeurs de la frontière » et le upperBound correspondant peut être construit avec un auto-rejoindre.
  2. Ensuite, utilisez ce tableau et le joindre à votre table « faits »:

(ne peut pas sembler comprendre comment formater correctement les statemen suivants pour apparaître comme code sans cette ligne ...) En fonction de vos besoins et de vos dbms, vous pourrez peut-être définir votre tableau Ages dans l'instruction SQL actuelle. (AFAIK, cela ne peut pas être fait dans Oracle, mais peut-être quelqu'un peut ajouter un commentaire sur la façon de le faire dans MySQL).