如何从查询中计算百分比?

时间:2021-05-18 15:45:35

标签: sql

我有一个查询(并按参数接收 2 个日期,即@DataDe=01/01/2021 和 @DataAte=18/05/2021),我想获取所有不同的值,不同值出现的总次数以及该值相对于所有值的百分比...

我的数据(一些值):

<头>
处理 数据
Proposta 2021-05-05
Proposta 2021-03-30
Proposta 2021-03-31
裁决 2021-04-05
Proposta 2021-04-12
联系方式 2021-04-29
联系方式 2021-04-30
Proposta 2021-05-14
Perdido 2021-04-14

还有我的查询:

SELECT Processo, dtmInicio 
    FROM  (SELECT (SELECT strDescricao FROM dbo.Tbl_Erm_ProcessoNegocio WITH (NOLOCK)
WHERE (intCodProcesso = cp.intEstado)) AS Processo, cp.dtmInicio FROM            dbo.Tbl_Clientes_Potenciais AS cp WITH (NOLOCK) INNER JOIN
dbo.Tbl_Moedas AS Moeda WITH (NOLOCK) ON Moeda.strAbreviatura = 'EUR' LEFT OUTER JOIN
dbo.Tbl_Gce_Vendedores ON cp.intCodVendedor = dbo.Tbl_Gce_Vendedores.intCodigo LEFT OUTER JOIN
dbo.Tbl_Clientes AS cl WITH (NOLOCK) ON cp.intCodCliente = cl.intCodigo
WHERE        (cp.dtmInicio >= @DataDe) AND (cp.dtmInicio < DATEADD(day, 1, @DataAte)) AND (cp.bitConvContacto = 0) AND (cp.bitConvCliente = 0)) AS Tabela

根据这些数据和查询,我开发了这个查询和这个输出:

SELECT Processo, COUNT(Processo) AS Total
FROM (SELECT (SELECT strDescricao FROM dbo.Tbl_Erm_ProcessoNegocio WITH (NOLOCK)
WHERE        (intCodProcesso = cp.intEstado)) AS Processo, cp.dtmInicio
FROM            dbo.Tbl_Clientes_Potenciais AS cp WITH (NOLOCK) INNER JOIN
dbo.Tbl_Moedas AS Moeda WITH (NOLOCK) ON Moeda.strAbreviatura = 'EUR' LEFT OUTER JOIN
dbo.Tbl_Gce_Vendedores ON cp.intCodVendedor = dbo.Tbl_Gce_Vendedores.intCodigo LEFT OUTER JOIN
dbo.Tbl_Clientes AS cl WITH (NOLOCK) ON cp.intCodCliente = cl.intCodigo
WHERE        (cp.dtmInicio >= @DataDe) AND (cp.dtmInicio < DATEADD(day, 1, @DataAte)) AND (cp.bitConvContacto = 0) AND (cp.bitConvCliente = 0)) AS Tabela
GROUP BY Processo

这是输出数据

<头>
处理 总计
Proposta 5
裁决 1
联系方式 2
Perdido 1

但我想添加一列,每行的百分比,相对于总数..是这样的:

<头>
处理 总计 %
Proposta 5 56%
裁决 1 11%
联系方式 2 22%
Perdido 1 11%

由于所有数据都是根据收到的参数生成的,我无法提前知道我会有多少行,你们有什么帮助或想法吗?

1 个答案:

答案 0 :(得分:0)

我的方法如下(SQL Fiddle 供参考):

WITH final AS (
SELECT 
    Processo,
    COUNT(*) AS Total,
    (SELECT COUNT(*) FROM your_data) AS Total_Sum
FROM your_data
GROUP BY 1, 3
  )
select 
    *,  
    CONCAT(ROUND(Total / Total_Sum * 100, 2), '%') AS percentage_total
from final;

名为 Total_Sum 的子查询将让您有一个额外的列,其中包含 Processo 的总数,这将让您将每个组划分为总数,从而获取比例:)

输出:

Processo         Total percentage_total
---------------- ----- ----------------
Proposta         5     55.56%
Adjudicado       1     11.11%
Contacto Inicial 2     22.22%
Perdido          1     11.11%