SQL Query - Lungo le linee di una tabella pivot
-
05-09-2019 - |
Domanda
Ho un mock up di una query SQL che rappresenterà una vera e propria domanda di sql.
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
Questo mi darà il risultato di:
atype btype count
-----------------
a x 1
a y 2
b x 1
b y 1
b z 1
Quello che sto cercando dopo questo è quello di essere in grado di creare un rapporto che appare fondamentalmente come:
atype|x| y| z
-------------
a |1| 2| 0
b |1| 1| 1
Sono sicuro che si può fare questo usando venire pazzo codice T-SQL, ma sto struggeling di farlo bene.
EDIT:
Sono d'accordo che è possibile utilizzare il comando PIVOT TSQL ma cosa succede quando BDigitare è variabile. Il che significa che non so quanti tipi ci saranno?
Soluzione
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
Altri suggerimenti
La risposta di @Tomalak
è bello, ma non c'è niente pazza di esso, semplicemente vecchio SQL
.
Ecco il codice T-SQL
veramente pazzesco che hai chiesto, nel caso in cui foste interessati:
SELECT atype, [x], [y], [z]
FROM (
SELECT atype, btype
FROM #tmp
) t
PIVOT
(
COUNT(btype)
FOR btype IN ([x], [y], [z])
) AS PivotTable
Sembra che un perno diretta è supportata solo da SQL Server 2005, come mostrato qui
Ecco come si può fare con Oracle - http: / /www.adp-gmbh.ch/ora/sql/examples/pivot.html
Vedere questo per una stored procedure per MySQL che produce una tabulazione incrociata: