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”是什么数据类型?