我有以下查询,显示结果如下:
考虑到可能引入更多的客户类型,我如何使结果显示如下:
Create Table #temp
(
[Name] varchar(50),
Country varchar(50),
ClientType varchar(50)
)
insert into #temp
(
Name,
Country ,
ClientType
)
select
'Joe Bloggs',
'USA',
'Client Type 1'
union
select
'John Doe',
'Canada',
'Client Type 1'
union
select
'Jane Smith',
'USA',
'Client Type 2'
select
Country,
ClientType,
count(*)
from
#temp
group by
Country,
ClientType
drop table #temp
答案 0 :(得分:3)
这种操作通常称为枢轴。许多主要的数据库供应商都有一些定制的语法可以执行它,但是我倾向于使用标准的sql来实现:
SELECT
country,
SUM(CASE WHEN clienttype = 'Client Type 1' THEN 1 END) as ClientType1,
SUM(CASE WHEN clienttype = 'Client Type 2' THEN 1 END) as ClientType2
FROM
#temp
GROUP BY country
如果运行时没有groupby和sum关键字,则将获得一个结果集,其中有country列(具有重复的值)和一个clienttype1列,每当客户端类型为1时该列都包含1,并且根本为空其他时间,并且clienttype2列在客户类型为2时为1,在其他所有时间为
按国家/地区分组,然后将我们混合的null / 1列加起来,得出count- null被认为是零
在sql server上,您将看到一条消息“通过聚合操作消除了空值”,但这是一个建议,在这种情况下是需要的。如果是其他选项,则可以使具有“ else 0”子句的效果相同。
我也可以使用COUNT而不是SUM,但是要计算出来,确实必须将其与1 / null混合,因为count会将值0视为“可计数的值”并将其计为1。如果使用COUNT
,则null非常重要答案 1 :(得分:2)
一种可能性是仅使用条件聚合来计算列中的特定客户端类型。
SELECT country [Country],
count(CASE
WHEN clienttype = 'Client Type 1' THEN
1
END) [Client Type 1],
count(CASE
WHEN clienttype = 'Client Type 2' THEN
1
END) [Client Type 2]
FROM #temp
GROUP BY country;
答案 2 :(得分:1)
尝试使用PIVOT。下面是一些如何使用PIVOT-
的想法WITH CTE(Country,ClientType,Count)
AS
(
SELECT 'Canada','Client Type 1',1 UNION ALL
SELECT 'USA','Client Type 1',1 UNION ALL
SELECT 'USA','Client Type 2',1
)
SELECT Country,
ISNULL([Client Type 1],0) [Client Type 1],
ISNULL([Client Type 2],0) [Client Type 2]
FROM
(
SELECT * FROM CTE
) AS P
PIVOT
(
SUM(Count)
FOR ClientType IN ([Client Type 1],[Client Type 2])
)AS PVT
答案 3 :(得分:1)
只需要这样使用PIVOT(在放下#temp之前将其添加到脚本中):
Select * from #temp
Pivot (Count(Name) for
ClientType in ([Client Type 1],[Client Type 2]))
As TablaPivot