Combinaison de plusieurs lignes en une seule ligne

J'ai une table contenant des permissions de count d'user et j'essaye d'écrire une requête pour returnner une rangée pour chaque combinaison de count d'user.

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 même mieux quelque chose comme ça.

 CltKey AcctKey HasTranTypeID1 HasTranTypeID2 HasTranTypeID3 10 2499 0 1 1 10 2764 1 1 0 

J'ai essayé de faire une auto-jointure, mais je continue d'get 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" nestedes, 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 fonctionner dans SQL 2000.

Cela fait un moment que j'ai utilisé 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; 

puis obtenez 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 indiquera que (cltkey, acctkey) a un access (d'un type particulier) si une ligne pour ce tuple de (cltkey, acctkey) a un access pour ce type particulier. Autrement dit, il s'agit essentiellement d'une ligne OR .

Si toutes les lignes de ce tuple doivent avoir un access pour que ce tuple ait un access, c'est-à-dire, si vous voulez une ligne AND , vous devrez faire ceci:

 min( case when trantypeid = 10 then case when access = 1 then 1 else 0 end else null end) as hastrantypeid1, etc. 
 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 ; 

Utilisez PIVOT – Voici un exemple: http://msdn.microsoft.com/en-us/library/ms177410.aspx