2010-07-30 8 views
2

J'ai une table contenant des autorisations de compte d'utilisateur et j'essaye d'écrire une requête pour retourner une ligne pour chaque combinaison compte d'utilisateur.Combinaison de plusieurs lignes dans une seule ligne

Voici ce que j'ai.

CltKey AcctKey TranTypeID Access 
10  2499 10   0 
10  2499 11   1 
10  2499 12   1 
10  2764 10   1 
10  2764 11   1 
10  2764 12   0 

Voici ce que j'aimerais avoir.

CltKey AcctKey TranTypeID1 Access1 TranTypeID2 Access2 TranTypeID3 Access3 
10  2499 10   0  11  1  12  1 
10  2764 10   1  11  1  12  0 

Ou encore mieux quelque chose comme ça. J'ai essayé d'effectuer une jointure automatique, mais je continue d'obtenir plusieurs lignes pour chaque TranTypeID. Un avec lui égal à 0 et un autre avec lui égal à 1. J'ai aussi essayé d'utiliser des instructions "Select" imbriquées, mais la performance est horrible. Est-ce que quelqu'un a une idée sur la façon de faire cela?

Merci.

Edit: Malheureusement, cela doit travailler dans SQL 2000.

+2

Pour quelle version de SQL Server? 2005+ a la syntaxe 'PIVOT'. Mais ce n'est pas dynamique ... –

Répondre

2

Il a été un moment que je SQLServer 2000, mais cela fonctionnera probablement.

select cltkey, acctkey, 
max(case when trantypeid = 10 and access = 1 
     then 1 else 0 end) as hastrantypeid1, 
max(case when trantypeid = 11 and access = 1 
     then 1 else 0 end) as hastrantypeid2, 
max(case when trantypeid = 12 and access = 1 
     then 1 else 0 end) as hastrantypeid3 
from table 
group by cltkey, acctkey; 

Sinon, essayez ceci:

create view has_access as 
select cltkey, acctkey, 
max(case when trantypeid = 10 and access = 1 
     then 1 else 0 end) as hastrantypeid1, 
max(case when trantypeid = 11 and access = 1 
     then 1 else 0 end) as hastrantypeid2, 
max(case when trantypeid = 12 and access = 1 
     then 1 else 0 end) as hastrantypeid3 
from table; 

et obtenir vos résultats de cette

select cltkey, acctkey, 
max(hastrantypeid1) as hastrantypeid1, 
max(hastrantypeid2) as hastrantypeid2, 
max(hastrantypeid2) as hastrantypeid2 
from has_access 
group by cltkey, acctkey; 

Notez que cela vous dira un (cltkey, acctkey) a accès (de un type particulier) si ligne pour ce tuple de (cltkey, acctkey) a accès pour ce type particulier. Autrement dit, il s'agit essentiellement d'une ligne OR.

Si toutes lignes pour que tuple doivent avoir accès à cette tuple d'avoir accès, qui est, si vous voulez une AND rangée sage, vous aurez besoin de faire ceci:

min(case when trantypeid = 10 
     then case when access = 1 
      then 1 else 0 end else null end) as hastrantypeid1, 
etc. 
+0

+1: La plupart des moyens portables d'une requête pivot. –

+0

Merci, la première déclaration fonctionne. – Waylon

1
SELECT CltKey, AcctKey, 
    MAX(CASE TrantypeId WHEN 10 THEN Access ELSE NULL END) AS HasTranTypeID1, 
    MAX(CASE TrantypeId WHEN 11 THEN Access ELSE NULL END) AS HasTranTypeID2, 
    MAX(CASE TrantypeId WHEN 12 THEN Access ELSE NULL END) AS HasTranTypeID3 
FROM PermissionsTable 
GROUP BY CltKey, AcctKey 
ORDER BY CltKey, AcctKey 
; 
Questions connexes