【问题标题】:Separate one column in a table that has specific value into two columns将表中具有特定值的一列分成两列
【发布时间】:2021-04-09 08:16:54
【问题描述】:

我必须将具有特定值的表中的一列分成两列,但我不明白为什么我的代码给了我错误的数字并且它不能正常工作。

我的代码是这样的:

SELECT Pname
    , (SELECT sum(Pcount) FROM Personal_tbl WHERE Pregion = 'Germany') AS German
    , (SELECT sum(Pcount) FROM Personal_tbl WHERE Pregion = 'UK') AS UK
    , COUNT(FID) AS Total
FROM Personal_tbl
GROUP BY Pname

输入:

Pname Pregion Pcount
Ava German 10
Ava UK 5

输出必须是这样的:

Pname German UK Total
Ava 10 5 15

【问题讨论】:

  • COUNT(FID) 返回该列中非空值的计数。这真的是你想要的吗?
  • 如果您将示例数据添加为 DDL/DML,那么人们可以更轻松地提供帮助。
  • 可以在sql server中使用pivot pivot
  • 'FID' 不存在?和Germany German。但是您实际上并没有说明您的代码返回的结果有什么问题?
  • 顺便说一句,我注意到您没有接受任何问题的单一答案 - 接受答案或解释为什么答案不能解决您的问题是 预期的在这个网站上进行礼仪。请重新审视您的所有问题并接受一些答案,然后您将有足够的代表来为有用的答案投票。

标签: sql sql-server tsql select


【解决方案1】:

您可以使用此示例代码进行数据透视

SELECT Pname,[German],[UK] , [German]+[UK] as Total
FROM 
(
    SELECT *
    FROM Personal_tbl
) AS sourcetable 
PIVOT 
(
    SUM(Pcount)
    FOR Pregion IN ([German],[UK])
) as pivottable

我创建了一个与您的结构相同的表并编写了示例数据透视代码

选择我的样本结果

Pname  Pregion Pcount
------ ------- -----------
Ava    German  10
Ava    UK      5

这是我的支点示例代码结果

Pname German UK  Total
------------ --- -----
Ava   10     5   15

【讨论】:

    【解决方案2】:

    您不需要编写子查询,只需使用如下条件聚合即可。

    SELECT pname
        ,SUM(CASE 
                WHEN Pregion = 'German'
                    THEN Pcount
                END) AS German
        ,SUM(CASE 
                WHEN Pregion = 'UK'
                    THEN Pcount
                END) AS uk
        ,SUM(Pcount) Total
    FROM Personal_tbl
    GROUP BY pname
    

    【讨论】:

    • 有什么理由加ELSE 0?我一直很好奇为什么要把它放进去或者为什么不放进去。我看不出有什么不同,只是想知道。
    • 所以没有任何偏好?
    • null 不会对总和产生任何影响,所以我觉得不需要指定 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多