2009-04-07 18 views
0

J'ai une maquette d'une requête sql qui représentera une véritable requête sql.Requête SQL - Le long des lignes d'un tableau croisé dynamique

Create table #tmp 
(
    Atype varchar(10), 
    Btype varchar(10) 
) 

insert into #tmp values ('a','x') 
insert into #tmp values ('b','x') 
insert into #tmp values ('a','y') 
insert into #tmp values ('a','y') 
insert into #tmp values ('b','z') 
insert into #tmp values ('b','y') 

select atype, btype,count(*) as count 
from #tmp 
group by atype, btype 
order by atype 

drop table #tmp 

Cela me donnera le résultat de:

atype btype count 
----------------- 
a  x  1 
a  y  2 
b  x  1 
b  y  1 
b  z  1 

Qu'est-ce que je cherche après cela est de pouvoir créer un rapport qui ressemble fondamentalement à:

atype|x| y| z 
------------- 
a |1| 2| 0 
b |1| 1| 1 

I Je suis sûr que vous pouvez le faire en utilisant le code t-sql fou, mais je me bats pour le faire correctement.

EDIT:

Je suis d'accord que vous pouvez utiliser la commande PIVOT TSQL mais ce qui se passe quand BTYPE est variable. Ce qui signifie que je ne sais pas combien de types il y aura?

Répondre

3
SELECT 
    atype, 
    SUM(CASE btype WHEN 'x' THEN 1 ELSE 0 END) AS x, 
    SUM(CASE btype WHEN 'y' THEN 1 ELSE 0 END) AS y, 
    SUM(CASE btype WHEN 'z' THEN 1 ELSE 0 END) AS z 
FROM 
    #tmp 
group by 
    atype 
order by 
    atype 
+1

+1 pour le code agréable et compact. Note à moi: lors de l'utilisation des opérateurs de comparaison, mettre WHEN immédiatement après le cas, par exemple: ColA \t \t \t \t \t, SUM (CAS QUAND Jours <= 0 ALORS 1 ELSE 0 END) AS [0] , SUM (CAS WHEN Days = 1 THEN 1 ELSE 0 END) AS [1] – mg1075

+0

@ mg1075 Les deux formes d'écriture d'un 'WHEN' sont différentes l'une de l'autre: Le' CASE x WHEN 1 then foo WHEN 2 BAR END' ressemble à un 'switch 'déclaration, il n'accepte pas les expressions. Alors que 'CASE WHEN x = 1 ALORS foo WHEN x = 2 ALORS barre END' ressemble à' if-else if' et attend des expressions. Utilisez le formulaire approprié pour chaque cas. – Tomalak

1

réponse de @Tomalak c'est sympa, mais il n'y a rien de fou, tout simplement vieux SQL.

Voici le code T-SQL vraiment fou que vous avez demandé, au cas où vous intéressiez:

SELECT atype, [x], [y], [z] 
FROM (
     SELECT atype, btype 
     FROM #tmp 
     ) t 
PIVOT 
     (
     COUNT(btype) 
     FOR btype IN ([x], [y], [z]) 
     ) AS PivotTable 
+0

pour quel moteur DB est-ce? –