我有多个联接的查询像这样:
SELECT branch,[language].Name,COUNT(r.ID) 'COUNTofStudent'
FROM Registration r
INNER JOIN Branch
ON r.fk_Branch=branch.ID
INNER JOIN [Language]
ON r.fk_Language=[Language].ID
GROUP BY branch,[language].Name
ORDER BY branch,[language].Name
让我回答:
Branch language COUNT
a English 234
a German 321
a Spanish 10
b English 258
b Spanish 159
。 。
现在我想拥有这一个:
Branch English German Spanish
a 234 321 10
b 258 0 159
。 。
如何使用查询执行此操作?
答案 0 :(得分:0)
declare @t table (Branch varchar(100),LanguageName varchar(100),COUNTID INT)
insert into @t(Branch,LanguageName,COUNTID)values ('A','ENG',234)
insert into @t(Branch,LanguageName,COUNTID)values ('A','German',321)
insert into @t(Branch,LanguageName,COUNTID)values ('A','Spanish',10)
insert into @t(Branch,LanguageName,COUNTID)values ('B','ENG',258)
insert into @t(Branch,LanguageName,COUNTID)values ('B','Spanish',159)
;With pivot_data as
(
Select Branch,LanguageName,COUNTID
from @t
)
select Branch,ISNULL([ENG],0)As English, ISNULL([Spanish],0)As Spanish,ISNULL([German],0)As German
from pivot_data
pivot ( max(COUNTID) for LanguageName in ([ENG], [Spanish],[German]) ) as p;
答案 1 :(得分:0)
--Conditional aggregation
;
WITH CTE
AS ( SELECT branch ,
[language].Name ,
COUNT(r.ID) as [COUNTofStudent]
FROM Registration r
INNER JOIN Branch ON r.fk_Branch = branch.ID
INNER JOIN [Language] ON r.fk_Language = [Language].ID
GROUP BY branch ,
[language].Name
ORDER BY branch ,
[language].Name
)
SELECT Branch ,
SUM(CASE WHEN Name = 'English' THEN [COUNTofStudent]
ELSE 0
END) AS English ,
SUM(CASE WHEN Name = 'German' THEN [COUNTofStudent]
ELSE 0
END) AS German ,
SUM(CASE WHEN Name = 'Spanish' THEN [COUNTofStudent]
ELSE 0
END) AS Spanish
FROM CTE
GROUP BY CTE.Branch