2010-09-21 1 views
0

Je me demandais s'il était possible de déterminer à partir de quelle colonne une valeur de coalescence est tirée?Recherche de la première valeur de recherche sur les colonnes et récupération des détails de la colonne.

je les données d'exemple suivantes (années réelles vont 1989-2010 en données non représenté par souci de concision)

ID | 2000 | 2000 value | 2001 |2001 value | 2002 |2002 value | 2003 |2003 value | 2004 | 2004 value | 2005 | 2005 value 
id001 | single | 15.46  |regular|50   | NULL | 0   |single | 152  | regular|15.20  |single| 15.99 
id002 | regular | 20.46  |regular|17.99  |single | 150.23 |both | 256.3 | NULL | 0   | NULL | 0 

Où seul/régulier/les deux reflètent comment cet ID payé pour quelque chose dans cette année (et NULL ne représente aucun achat). Ce que j'aimerais idéalement avoir, c'est que trois colonnes par année pour les années 2005-2010 indiquent le type de paiement unique le plus récent avant cette année (et l'année où il tombe), ainsi qu'une colonne pour les paiements réguliers. et les deux types de paiement

pour l'exemple ci-dessus les résultats ressembleraient:

ID | 2005 prior single year | 2005 prior regular year | 2005 prior both year 
id001 | 2003     | 2004      | NULL 
id002 | 2002     | 2001      | 2003 

Je voudrais aussi pouvoir tirer les valeurs respectives ainsi (pour toutes les années 2005-2010).

Fondamentalement, il suffit de regarder à travers les colonnes pour trouver la première instance, mais au-delà d'une sorte de fusion, je ne suis pas sûr de la meilleure façon d'aborder cela!

Merci! :)

+0

Je n'aime pas si les structures de données qui ne sont pas normalisées. Fait écrire une requête égale à l'enfer. Peut-être serait-il sensé de transformer les données en une structure de données conforme à la 3e forme normale? – AlexanderMP

Répondre

1

D'abord, j'écrirait en vue de normaliser les données:

select 2000 as year 
,  [2000 value] as value 
,  [2000 type] as type 
from YourTable 
where year = 2000 
union all 
select 2001 
,  [2001 value] 
,  [2001 type] 
from YourTable 
where year = 2001 
.... 

Ensuite, vous pouvez consulter la première année avant 2005 comme:

select a.year [prior to 2005] 
,  a.value 
,  a.id 
from YourView a 
where year = 
     (
     select max(year) 
     from YourView b 
     where a.id = b.id 
       and a.type = b.type 
       and b.year < 2005 
     ) 

Une fois que vous avez la normalisée données, vous pouvez créer de nombreuses variantes sur ce thème.

+0

Le problème avec ceci est que je cherche non seulement l'année la plus récente, mais l'année la plus récente du même type, donc la clause where devrait également inclure WHERE 2005 = single et le résultat de la clause where est égal à célibataire, qui est le principal problème avec lequel je lutte! Merci – Dibstar

+0

@Davin: Vous pouvez vérifier l'égalité de type et d'id dans la clause where? Réponse éditée – Andomar

+0

+1 pour la normalisation. –

1

A partir de la table existante, essayez:

select ID, 
     case 'single' 
      when [2004] then '2004' 
      when [2003] then '2003' 
      when [2002] then '2002' 
      when [2001] then '2001' 
      when [2000] then '2000' 
      else NULL 
     end [2005 prior single year], 
     case 'regular' 
      when [2004] then '2004' 
      when [2003] then '2003' 
      when [2002] then '2002' 
      when [2001] then '2001' 
      when [2000] then '2000' 
      else NULL 
     end [2005 prior regular year], 
     case 'both' 
      when [2004] then '2004' 
      when [2003] then '2003' 
      when [2002] then '2002' 
      when [2001] then '2001' 
      when [2000] then '2000' 
      else NULL 
     end [2005 prior both year] 
from YourTable YT 
+0

Merci pour cela, mais malheureusement, comme ma gamme d'années s'étend de 1989 à 2010, ce n'est pas vraiment très pratique d'avoir cette déclaration de cas, car il deviendra plutôt grand pour les années plus tard! – Dibstar

+0

@Davin: copier et coller, mon ami! Sérieusement, c'est pourquoi la normalisation est une meilleure approche à long terme - c'était une solution unique «rapide et sale». –