SQL Query - Ao longo das linhas de uma tabela pivô
-
05-09-2019 - |
Pergunta
Eu tenho um up simulada de uma consulta sql que irá representar uma consulta SQL real.
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
Isso vai me dar o resultado de:
atype btype count
-----------------
a x 1
a y 2
b x 1
b y 1
b z 1
O que eu estou procurando após este é para ser capaz de criar um relatório que basicamente se parece com:
atype|x| y| z
-------------
a |1| 2| 0
b |1| 1| 1
Eu tenho certeza que você pode fazer isso usando vêm código louco T-SQL, mas estou debatendo para ter direito.
EDIT:
Eu concordo que você pode usar o comando TSQL PIVOT, mas o que acontece quando Btype é variável. O que significa que eu não sei quantos tipos haverá?
Solução
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
Outras dicas
A resposta de @Tomalak
é bom, mas não há nada de louco por ela, simplesmente SQL
de idade.
Aqui está o código T-SQL
realmente louco você pediu, no caso de você estavam interessados:
SELECT atype, [x], [y], [z]
FROM (
SELECT atype, btype
FROM #tmp
) t
PIVOT
(
COUNT(btype)
FOR btype IN ([x], [y], [z])
) AS PivotTable
Parece que um pivô direta só é suportada pelo SQL Server 2005, como mostrado aqui
Aqui está como isso pode ser feito com a Oracle - http: / /www.adp-gmbh.ch/ora/sql/examples/pivot.html
Veja este para um procedimento armazenado para MySQL que produz uma tabulação cruzada: