1

下午好,

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

行到列 SQL Server 查询

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

我使用此查询获取数据:

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

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

4

1 回答 1

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

于 2012-08-30T13:17:17.723 回答