Sql交叉表中的百分比

Sql交叉表中的百分比,sql,sql-server,tsql,Sql,Sql Server,Tsql,我非常感谢你的帮助。我不知道这是否可行,但我想在下面的交叉表/数据透视表中添加一些百分比 select Isnull(SM.StatID, 'Total'), count(case when ETT.description = 'Equip1' then I.Identifier else null end) as 'Equip1', count(case when ETT.description = 'Equip2' then I.Identifier else null end) as

我非常感谢你的帮助。我不知道这是否可行,但我想在下面的交叉表/数据透视表中添加一些百分比

select

Isnull(SM.StatID, 'Total'),

count(case when ETT.description  = 'Equip1' then I.Identifier else null end) as 'Equip1',
count(case when ETT.description = 'Equip2' then I.Identifier else null end) as 'Equip2',
count(case when ETT.description = 'Equip3' then I.Identifier else null end) as 'Equip3',


from _INCIDENT as I
JOIN _EQUIP as EU on I.Identifier = EU.Identifier
JOIN _EquipTypeType as ETT on EU.EquipType = ETT.code
JOIN _StationMapping as SM on I.PartyStatId =  SM.CCStatID

group by statID with rollup
电流输出

    statID   Equip1    Equip2   Equip3    Total
    A          2         6        5        13
    B          4         3        4        11
    C          5         4        3        12
    Total      11        13       12       34
我希望它看起来怎么样

    statID      Equip1 |  %  | Equip2 |  %  |  Equip3  |  %  |  Total
    A            2     | 15% |    6   | 46% |    5     | 38% |   13
    B            4     | 36% |    3   | 27% |    4     | 36% |   11
    C            5     | 41% |    4   | 33% |    3     | 25% |   12
    Total        11               13             12              34
如果做不到这一点就好了

    statID       Equip1   Equip2    Equip3    Total
    A              15%       46%      38%       13
    B              36%       27%      36%       11
    C              41%       33%      25%       12

非常感谢

假设您使用的是SQL Server,请尝试以下操作:

SELECT
    statID
    , Equip1
    , CAST((Equip1 * 100.0 / Total) AS NVARCHAR(MAX)) + '%' as 'Equip1 %'
    , Equip2
    , CAST((Equip2 * 100.0 / Total) AS NVARCHAR(MAX)) + '%' as 'Equip2 %'
    , Equip3
    , CAST((Equip3 * 100.0 / Total) AS NVARCHAR(MAX)) + '%' as 'Equip3 %'
    , Total
FROM
    (SELECT Isnull(SM.StatID, 'Total') as 'statID'
        , count(case when ETT.description = 'Equip1' then I.Identifier else null end) as 'Equip1'
        , count(case when ETT.description = 'Equip2' then I.Identifier else null end) as 'Equip2'
        , count(case when ETT.description = 'Equip3' then I.Identifier else null end) as 'Equip3'
        , count(case when ETT.description IN ( 'Equip1', 'Equip2', 'Equip3') then I.Identifier else null end) as 'Total'
    FROM _INCIDENT AS I
    INNER JOIN _EQUIP AS EU
        ON I.Identifier = EU.Identifier
    INNER JOIN _EquipTypeType AS ETT
        ON EU.EquipType = ETT.code
    INNER JOIN _StationMapping AS SM
        ON I.PartyStatId = SM.CCStatID
    GROUP BY statID
    WITH rollup) result_set

我真的很困惑这个百分比是从哪里来的???很抱歉让人困惑。。。。它们来自“总计”列。您可以忽略“总计”行。很抱歉造成混淆。。。。它们来自“总计”列。您可以忽略“总计”行。如果你把“A”想象成一家医院,他们使用Equip1(某种类型的设备)2次Equip2 6次和Equip3 5次,总共使用了13种不同的设备。2/13 *100 = 15% 6/13 *100 = 46% etc@whitz您使用的是什么RDBMS?感谢您的回复,您尝试过它并收到此错误感谢您的回复,您尝试过它并收到此错误。很抱歉,如果这是显而易见的,仍然在学习诀窍!Msg 8114,级别16,状态5,第1行将数据类型varchar转换为数字时出错。警告:聚合或其他集合操作会消除空值。@现在试试看,我对第一列做了一个小改动。产生此错误的原因是,在该列中,您通常会显示
SM.StatID
,这是一个数字,但如果该值为
NULL
,则您希望显示
Total
,这是一个字符串。这是不可能的,因为列中的所有值都需要具有相同的数据类型。为了解决这个问题,我使用了一个
CAST()
将所有内容转换为
NVARCHAR()
(因此是一个字符串)请不要认为其他人能帮上忙?运行Radu的代码Msg 8114,16级,状态5,第1行时获取为错误消息将数据类型varchar转换为数字时出错。警告:聚合或其他集合操作会消除空值。@whitz忘记了这一点,请立即重试。另外,“SM.statID”是什么数据类型?