SQL中的列的行是计数列之一

时间:2012-08-30 12:59:01

标签: sql-server select count transpose

下午好,

我试图在这个问题中使用CASE将行转换为列:

Rows to columns SQL Server query

但是在我的情况下,我没有包含信息的列,这是一个数据计数。

我使用此查询获取数据:

select MA, SN, count(*) 
from Original
where MA = 'AB'
group by MA

查询结果:

MA  SN      COUNT
AB  TEXTA   6
AB  TEXTB   5
AB  TEXTC   3
AB  TEXTD   4

表原文

MA  SN      
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
AB  TEXTA   
.
.
.
AB  TEXTD   
AB  TEXTD   

表结果:

MA      TEXTA   TEXTB   TEXTC   TEXTD
AB      6       5       3       4

这是我目前的疑问:

select  MA,
        count(*) as 'COUNT2',
    MAX(CASE WHEN SN = 'TEXTA' THEN COUNT2 end) as TEXTA1,
    MAX(CASE WHEN SN = 'TEXTB' THEN COUNT2 end) as TEXTB1,
    MAX(CASE WHEN SN = 'TEXTC' THEN COUNT2 end) as TEXTC1,
    MAX(CASE WHEN SN = 'TEXTD' THEN COUNT2 end) as TEXTD1,

from Original
where MA= 'AB'
group by MA

我在查询中做错了什么?并且有人可以解释为什么我发布的问题有效,但没有计数吗?谢谢! :)。

1 个答案:

答案 0 :(得分:4)

编辑:您无法按照预期的方式使用COUNT2,因为选择列表中的后续列不能引用先前列的别名。因此COUNT2在查询中的任何其他位置都没有意义,除非您将该部分转换为子查询(或cte)然后引用它。

因此,使用更新的架构,您需要子查询来执行计数。基本上将您的第一个查询作为子查询删除到第二个查询(替换Original),然后添加一些缺少group by列,然后它可以工作:

select  MA,
    MAX(CASE WHEN SN = 'TEXTA' THEN COUNT2 end) as TEXTA1,
    MAX(CASE WHEN SN = 'TEXTB' THEN COUNT2 end) as TEXTB1,
    MAX(CASE WHEN SN = 'TEXTC' THEN COUNT2 end) as TEXTC1,
    MAX(CASE WHEN SN = 'TEXTD' THEN COUNT2 end) as TEXTD1
from (
    select MA, SN, count(*) as COUNT2
    from Original
    where MA = 'AB'
    group by MA, SN
) Original
where MA= 'AB'
group by MA

http://www.sqlfiddle.com/#!3/41c79/7