添加两个不同的SQL计数查询
我使用的是SQL Server 2008,我有两个单独的计数查询。我想将这两个查询除以100得到一个百分比 这两个问题添加两个不同的SQL计数查询,sql,sql-server,Sql,Sql Server,我使用的是SQL Server 2008,我有两个单独的计数查询。我想将这两个查询除以100得到一个百分比 这两个问题 SELECT COUNT(*) FROM ( SELECT * FROM admin WHERE principal LIKE '%Mrs%' UNION SELECT * FROM admin where deputy_principal LIKE '%Mrs%' ) as Count1 SELECT COUNT(*) * 2 FROM ad
SELECT COUNT(*) FROM
(
SELECT * FROM admin WHERE principal LIKE '%Mrs%'
UNION
SELECT * FROM admin where deputy_principal LIKE '%Mrs%'
) as Count1
SELECT COUNT(*) * 2 FROM admin as Count2
我试过这样的方法:
SELECT(
SELECT COUNT(*) FROM
(
SELECT * FROM admin WHERE principal LIKE '%Mrs%'
UNION
SELECT * FROM admin where deputy_principal LIKE '%Mrs%'
)
/
(
SELECT COUNT(*) * 2 FROM admin as Count2
)
)
但我得到语法错误,我无法正确调试。哪种方法是正确的
它应该将Count1和Count2相除,然后乘以100,并按如下方式显示:
37%
UDPATE:使用虚拟数据与原始方法进行比较……
DECLARE @admin TABLE(Id INTEGER IDENTITY(1,1), principal VARCHAR(50),
deputy_principal VARCHAR(50))
INSERT @admin (principal, deputy_principal)
VALUES ('Mr Person 1', 'Mr Person 2'),
('Mrs Person 3', 'Mr Person 4'),
('Mr Person 5', 'Mrs Person 6'),
('Mrs Person 7', 'Mrs Person 8')
-- Original attempted way (syntax corrected)
SELECT ((
SELECT CAST(COUNT(*) AS DECIMAL(18,2))
FROM
(
SELECT * FROM @admin WHERE principal LIKE '%Mrs%'
UNION
SELECT * FROM @admin where deputy_principal LIKE '%Mrs%'
) x)
/
(SELECT CAST(COUNT(*) * 2 AS DECIMAL(18,2)) FROM @admin)) * 100
-- Shortened query
SELECT
((SELECT CAST(COUNT(*) AS DECIMAL(18,2)) FROM @admin WHERE principal LIKE '%Mrs%'
OR deputy_principal LIKE '%Mrs%') /
(SELECT CAST(COUNT(*) * 2 AS DECIMAL(18,2)) FROM @admin)) * 100
两者都输出相同的结果:在本例中为37.5
declare @firstquerycount as integer;
declare @secondquerycount as integer;
SELECT @firstquerycount = COUNT(*) FROM admin WHERE principal LIKE '%Mrs%';
SELECT @secondquerycount = COUNT(*) FROM admin WHERE deputy_principal LIKE '%Mrs%';
UDPATE:使用虚拟数据与原始方法进行比较……
DECLARE @admin TABLE(Id INTEGER IDENTITY(1,1), principal VARCHAR(50),
deputy_principal VARCHAR(50))
INSERT @admin (principal, deputy_principal)
VALUES ('Mr Person 1', 'Mr Person 2'),
('Mrs Person 3', 'Mr Person 4'),
('Mr Person 5', 'Mrs Person 6'),
('Mrs Person 7', 'Mrs Person 8')
-- Original attempted way (syntax corrected)
SELECT ((
SELECT CAST(COUNT(*) AS DECIMAL(18,2))
FROM
(
SELECT * FROM @admin WHERE principal LIKE '%Mrs%'
UNION
SELECT * FROM @admin where deputy_principal LIKE '%Mrs%'
) x)
/
(SELECT CAST(COUNT(*) * 2 AS DECIMAL(18,2)) FROM @admin)) * 100
-- Shortened query
SELECT
((SELECT CAST(COUNT(*) AS DECIMAL(18,2)) FROM @admin WHERE principal LIKE '%Mrs%'
OR deputy_principal LIKE '%Mrs%') /
(SELECT CAST(COUNT(*) * 2 AS DECIMAL(18,2)) FROM @admin)) * 100
两者都输出相同的结果:在本例中为37.5
declare @firstquerycount as integer;
declare @secondquerycount as integer;
SELECT @firstquerycount = COUNT(*) FROM admin WHERE principal LIKE '%Mrs%';
SELECT @secondquerycount = COUNT(*) FROM admin WHERE deputy_principal LIKE '%Mrs%';
现在,firstquerycount和secondquerycount保存各自查询的相应计数的值。您可以根据您的要求使用它们,如
select convert(varchar(10),(((@firstquerycount+@secondquerycount)/2)*100))+'%'
注意,我没有尝试此查询-请根据您的要求进行更改
SELECT princi, total, (princi*100)/CAST(total AS REAL)
FROM
(SELECT COUNT(CASE WHEN principal LIKE '%Mrs%'
OR deputy_principal LIKE '%Mrs%'
THEN 1 END), COUNT(*)*2
FROM admin) AS X(princi,total)
现在,firstquerycount和secondquerycount保存各自查询的相应计数的值。您可以根据您的要求使用它们,如
select convert(varchar(10),(((@firstquerycount+@secondquerycount)/2)*100))+'%'
注意:我没有尝试此查询-请根据您的要求进行更改您可以像这样一次完成所有操作,
SELECT princi, total, (princi*100)/CAST(total AS REAL)
FROM
(SELECT COUNT(CASE WHEN principal LIKE '%Mrs%'
OR deputy_principal LIKE '%Mrs%'
THEN 1 END), COUNT(*)*2
FROM admin) AS X(princi,total)
SELECT
CONVERT(
VARCHAR(10),
(
CONVERT(Real, SUM(Mrs))
/
CONVERT(Real, COUNT(*))
) * 100
) + '%'
[DoubledUpMrsPercentage]
FROM (
SELECT
CASE
WHEN [principal] LIKE '%Mrs%' OR
[deputy_principal] LIKE '%Mrs%' THEN 1
ELSE 0
END Mrs
FROM
[admin]
) Flags;
您可以像这样一次完成所有操作,
SELECT
CONVERT(
VARCHAR(10),
(
CONVERT(Real, SUM(Mrs))
/
CONVERT(Real, COUNT(*))
) * 100
) + '%'
[DoubledUpMrsPercentage]
FROM (
SELECT
CASE
WHEN [principal] LIKE '%Mrs%' OR
[deputy_principal] LIKE '%Mrs%' THEN 1
ELSE 0
END Mrs
FROM
[admin]
) Flags;
您可以使用
大小写表达式
和SUM()函数
尝试如下操作:
SELECT SUM(CASE WHEN principal LIKE '%Mrs%' OR
deputy_principal LIKE '%Mrs%' THEN 100.0 END) / SUM(2) Pecentage
FROM admin
使用@AdaTheDev的数据您可以使用
大小写表达式
和SUM()函数
尝试如下操作:
SELECT SUM(CASE WHEN principal LIKE '%Mrs%' OR
deputy_principal LIKE '%Mrs%' THEN 100.0 END) / SUM(2) Pecentage
FROM admin
使用@AdaTheDev的数据如果您使用的是SQL Server 2008,为什么会将此标记为mysql?是否有
主体
和副主体
都包含Mrs
的行,你想数两次吗?你可能会发现,指望PK比指望一切都快。如果你使用的是SQL Server 2008,你也可能会发现这一点。为什么这个标签是mysql?是否有主体和副主体都包含“Mrs”
,你想数两次吗?你可能会发现依赖PK比依赖一切都快。你也可能会发现这可能会产生不同的结果,但这可能是OP真正想要的结果。当我以不同的方式执行查询时,这给了我一个零的答案values@WilliamTheDev我已经更新了我的答案,需要将计数转换为小数,因为它们是整数(因此输出为0)@Jodrell No,它将给出相同的结果。见比较update@WilliamTheDev据我所知,你想要50%的测试数据,对吗?这可能会产生不同的结果,但这可能是OP实际想要的结果。这给了我一个零的答案,但当我以不同的方式执行查询时,他们都有values@WilliamTheDev我已经更新了我的答案,需要将计数转换为小数,因为它们是整数(因此输出为0)@Jodrell No,它将给出相同的结果。见比较update@WilliamTheDev据我所知,你想要50%的测试数据,对吗?你忘了把管理员的COUNT*乘以2。你忘了把管理员的COUNT*乘以2。Jodrell,它可能在转换过程中丢失,但最终答案与实际答案相差约4.7%。应该改为十进制。@WilliamTheDev,我已经修改了,我认为这是浮点数有意义的情况之一。@WilliamTheDev,你真的想在末尾加百分号吗?是的,我想。在SQL server中如何输出这些内容?@WilliamTheDev,我已经稍微修改了我的答案,以给出一个更“正确”的结果。我把它留在这里是因为您希望在结果中附加一个'%'
。然而,我觉得Kaf的回答是优越的。要在查询时给出相同的答案,请保持原样,为COUNT(1)
提供更“准确”的结果替换SUM(2)
。Jodrell,它可能在转换过程中丢失,但最终答案与实际答案相差约4.7%。应该改为十进制。@WilliamTheDev,我已经修改了,我认为这是浮点数有意义的情况之一。@WilliamTheDev,你真的想在末尾加百分号吗?是的,我想。在SQL server中如何输出这些内容?@WilliamTheDev,我已经稍微修改了我的答案,以给出一个更“正确”的结果。我把它留在这里是因为您希望在结果中附加一个'%'
。然而,我觉得Kaf的回答是优越的。要在查询时给出相同的答案,请保持原样,为COUNT(1)
提供一个更“准确”的结果替换SUM(2)
。实际上,我想将其乘以2…这不是一个错误。这是因为这将给我管理员的总数,这是因为有两排并排-副校长和校长。@WilliamTheDev在这种情况下,我又把它包括进去了。我不知道为什么,但这给了我一个108%的折扣。我不确定100.0或者查询的0个结束部分意味着什么,否则我会帮助调试它。@WilliamTheDev我乘以2而不是除法。我改正了now@t-克劳森,dk…谢谢。我真的想把它乘以2…这不是一个错误。这是因为这将给我管理员的总数,这是因为有两排并排-副校长和校长。@WilliamTheDev在这种情况下,我又把它包括进去了。我不知道为什么,但这给了我一个108%的折扣。我不确定100.0或者查询的0个结束部分意味着什么,否则我会帮助调试它。@WilliamTheDev我乘以2而不是除法。我改正了now@t-克劳森.dk…谢谢.呃,什么CategoryID
,什么ERP\u FMS\u ChartOfAccount
?呃,什么CategoryID
,什么ERP\u FMS\u ChartOfAccount
?我喜欢这个答案。言简意赅