Sql server SQL中的行到列是计数的列之一

Sql server SQL中的行到列是计数的列之一,sql-server,select,count,transpose,Sql Server,Select,Count,Transpose,下午好 我试图使用这个问题中的案例将行转换为列: 然而,在我的例子中,我没有包含信息的列,它是一个数据计数 我通过此查询获取数据: 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

下午好

我试图使用这个问题中的案例将行转换为列:

然而,在我的例子中,我没有包含信息的列,它是一个数据计数

我通过此查询获取数据:

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
我在查询中犯了什么大错?。有人能解释一下为什么在我贴的问题中它是有效的,但与计数无关吗?。谢谢

Edit:不能按预期方式使用COUNT2,因为选择列表中的后续列不能引用以前列的别名。所以COUNT2在查询中的其他任何地方都没有意义,除非您将该部分转换为子查询或cte,然后引用它

因此,对于更新的模式,您需要一个子查询来进行计数是有意义的。实际上,将第一个查询作为子查询放到第二个查询中以替换原始查询,然后添加一些缺少的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
编辑:不能按预期方式使用COUNT2,因为选择列表中的后续列不能引用以前列的别名。所以COUNT2在查询中的其他任何地方都没有意义,除非您将该部分转换为子查询或cte,然后引用它

因此,对于更新的模式,您需要一个子查询来进行计数是有意义的。实际上,将第一个查询作为子查询放到第二个查询中以替换原始查询,然后添加一些缺少的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

这是microsoft SQL,我在我的查询中没有看到输入错误,我写的是COUNT2,然后是COUNT2。如果您引用的是原始表,那么这是通过另一个查询获得的,我可以写任何我想要的名称。谢谢。问题的演示:这是microsoft SQL,我在我的查询中没有看到输入错误,我写的是COUNT2,然后是COUNT2。如果您引用的是原始表,那么这是通过另一个查询获得的,我可以写任何我想要的名称。谢谢。问题演示:您好,谢谢您的回答,正如问题中提到的,我没有一个包含信息的专栏,这是一个数据计数。我编写了一个示例查询来获取数据。这就是我的问题和这个问题之间的区别:Hi@Eduardo:如果你看一下,你会发现它将你的表原始转换为你在结果中的预期输出。您能解释一下这是否不是期望的结果吗?您好,我检查了查询,您正在手动写入值6、5、4和3,在我的情况下,这些值可以更改,因为它们是计数操作的结果。表格原件应如下所示:创建表格原件'AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTB','AB','TEXTB','AB','TEXTB','AB','TEXTB','AB','TEXTC','c','AB','TEXTC'AB','TEXTD';'AB','TEXTD';'AB、TEXTD;Í再次更新了我的问题,所以问题变得更清楚了。对不起,弄糊涂了。@Eduardo:我明白了,是的,现在它更有意义了:。我认为马哈茂德加马尔的答案是正确的,可惜他把它删掉了。编辑:更新了一个答案,该答案应该符合您的新解释。您好,谢谢您的回答,正如问题中提到的,我没有包含信息的专栏,这是一个数据计数。我编写了一个示例查询来获取数据。这就是我的问题和这个问题之间的区别:Hi@Eduardo:如果你看一下,你会发现它将你的表原始转换为你在结果中的预期输出。您能解释一下这是否不是期望的结果吗?您好,我检查了查询,您正在手动写入值6、5、4和3,在我的情况下,这些值可以更改,因为它们是计数操作的结果。表格原件应如下所示:创建表格原件'AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTA','AB','TEXTB','AB','TEXTB','AB','TEXTB','AB','TEXTB','AB','TEXTC','c','AB','TEXTC'AB','TEXTD';'AB','TEXTD';'AB、TEXTD;Í再次更新了我的问题,所以问题变得更清楚了。对不起,弄糊涂了。@Eduardo:我明白了,是的,现在它更有意义了:。我认为马哈茂德加马尔的答案是正确的,可惜他把它删掉了。编辑:更新后的答案应符合您的新解释。