将列转换为分组依据/计数

时间:2019-06-01 03:39:04

标签: sql sql-server tsql

我有以下查询,显示结果如下:

enter image description here

考虑到可能引入更多的客户类型,我如何使结果显示如下:

enter image description here

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

4 个答案:

答案 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