SQL查询-沿着数据透视表的行

SQL查询-沿着数据透视表的行,sql,pivot-table,Sql,Pivot Table,我有一个sql查询的模型,它将表示一个真正的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 v

我有一个sql查询的模型,它将表示一个真正的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
这将给我以下结果:

atype btype count
-----------------
a     x     1
a     y     2
b     x     1
b     y     1
b     z     1
在此之后,我希望能够创建一个基本上如下所示的报告:

atype|x| y| z
-------------
a    |1| 2| 0
b    |1| 1| 1
我相信你可以使用come crazy t-sql代码来实现这一点,但我正在努力使它正确

编辑:


我同意您可以使用TSQL PIVOT命令,但是当Btype是变量时会发生什么呢。这意味着我不知道将有多少种类型?

似乎只有SQL Server 2005支持直接透视,如图所示

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

下面是如何使用Oracle完成的-

似乎只有SQL Server 2005才支持直接透视,如图所示


下面是如何使用Oracle完成此操作的方法-

请参见以下内容,了解用于生成交叉表格的MySQL存储过程:


有关MySQL的存储过程,请参见以下内容,该存储过程生成交叉列表:


@Tomalak
的答案很好,但它并没有什么疯狂之处,只是简单的老式
SQL

如果您感兴趣,下面是您要求的真正疯狂的
T-SQL
代码:

SELECT  atype, [x], [y], [z]
FROM    (
        SELECT  atype, btype
        FROM    #tmp
        ) t
PIVOT
        (
        COUNT(btype)
        FOR btype IN ([x], [y], [z])
        ) AS PivotTable

@Tomalak
的答案很好,但它并没有什么疯狂之处,只是简单的老式
SQL

如果您感兴趣,下面是您要求的真正疯狂的
T-SQL
代码:

SELECT  atype, [x], [y], [z]
FROM    (
        SELECT  atype, btype
        FROM    #tmp
        ) t
PIVOT
        (
        COUNT(btype)
        FOR btype IN ([x], [y], [z])
        ) AS PivotTable

+1用于简洁的代码。给自己的提示:当使用比较运算符时,请将when紧跟在CASE之后,例如:ColA、SUM(CASE WHEN Days@mg1075编写
WHEN
的两种形式彼此不同:
CASE x WHEN 1,foo WHEN 2,bar END
类似于
switch
语句,它不接受表达式。而
CASE WHEN x=1,foo WHEN x=2,bar END
类似于
if else if
并期望按。为每个案例使用适当的形式。+1表示简洁明了的代码。注意:当使用比较运算符时,请将when紧跟在案例之后,例如:ColA、SUM(CASE WHEN Days@mg1075编写
WHEN
的两种形式彼此不同:
CASE x WHEN 1,foo WHEN 2,bar END
类似于
switch
语句,它不接受表达式。而
CASE WHEN x=1,foo WHEN x=2,bar END
类似于
if else if
并期望按每种情况使用适当的表格。