添加两个不同的SQL计数查询

添加两个不同的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

我使用的是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 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
?我喜欢这个答案。言简意赅