计算百分比 while select - T-SQL

Calculate percentage while select - T-SQL

我有一个存储过程:

ALTER PROCEDURE GetReportData
AS
BEGIN
    SELECT 
        LOC.SubCompanyNameVN,
        LOC.BranchName,
        COUNT(LOC.BranchCode) as Total,

        ----------- Not Processed Yet
        -- Count
        (SELECT COUNT(WS.ID)
            FROM DBO.WorkingSession AS WS
            JOIN DBO.Location AS LO ON WS.LocationID = LO.LocationID AND WS.BranchCode = LO.BranchCode
            WHERE WS.Status = 5 OR WS.Status = 6 AND LO.BranchCode = LOC.BranchCode) AS CountNotProcessedYet,
        ------------

        ----------- Processing
        -- Count
        (SELECT COUNT(WS.ID)
            FROM DBO.WorkingSession AS WS
            JOIN DBO.Location AS LO ON WS.LocationID = LO.LocationID AND WS.BranchCode = LO.BranchCode
            WHERE WS.Status = 3 AND LO.BranchName = LOC.BranchName) AS CountProcessing,
        ------------
    FROM DBO.WorkingSession AS SS
    JOIN DBO.Location AS LOC ON SS.LocationID = LOC.LocationID AND SS.BranchCode = LOC.BranchCode
    JOIN DBO.Status AS ST ON SS.Status = ST.ID
    GROUP BY LOC.SubCompanyNameVN, LOC.BranchName, LOC.BranchCode
    ORDER BY LOC.SubCompanyNameVN
END

结果:

SubCompanyNameVN BranchName Total CountNotProcessedYet CountProcessing
Vùng 1 HNI_01 5 3 2
Vùng 1 HNI_02 15 5 10
Vùng 1 HNI_07 12 6 6

但我期望的结果是:

SubCompanyNameVN BranchName Total CountNotProcessedYet percentNotProcessedYet CountProcessing percentProcessing
Vùng 1 HNI_01 5 3 60% 2 40%
Vùng 1 HNI_02 15 5 33.33% 10 66.67%
Vùng 1 HNI_07 12 6 50% 6 50%

所以我像这样更新我的存储过程:

ALTER PROCEDURE GetReportData
AS
BEGIN
    SELECT 
        LOC.SubCompanyNameVN,
        LOC.BranchName,
        COUNT(LOC.BranchCode) as Total,

        ----------- Not Processed Yet
        -- Count
        (SELECT COUNT(WS.ID)
            FROM DBO.WorkingSession AS WS
            JOIN DBO.Location AS LO ON WS.LocationID = LO.LocationID AND WS.BranchCode = LO.BranchCode
            WHERE WS.Status = 5 OR WS.Status = 6 AND LO.BranchCode = LOC.BranchCode) AS CountNotProcessedYet,
         --- Percent
        ROUND((CountNotProcessedYet/Total)*100,2)
        ------------

        ----------- Processing
        -- Count
        (SELECT COUNT(WS.ID)
            FROM DBO.WorkingSession AS WS
            JOIN DBO.Location AS LO ON WS.LocationID = LO.LocationID AND WS.BranchCode = LO.BranchCode
            WHERE WS.Status = 3 AND LO.BranchName = LOC.BranchName) AS CountProcessing,
        --- Percent
        ROUND((CountProcessing/Total)*100,2)
        ------------
    FROM DBO.WorkingSession AS SS
    JOIN DBO.Location AS LOC ON SS.LocationID = LOC.LocationID AND SS.BranchCode = LOC.BranchCode
    JOIN DBO.Status AS ST ON SS.Status = ST.ID
    GROUP BY LOC.SubCompanyNameVN, LOC.BranchName, LOC.BranchCode
    ORDER BY LOC.SubCompanyNameVN
END

错误:

有什么方法可以计算百分比吗?

可能是这样

    SELECT 
        LOC.SubCompanyNameVN,
        LOC.BranchName,
        COUNT(SS.ID) as Total,
        COUNT(CASE WHEN SS.Status IN (5, 6)
              THEN SS.ID END) AS CountNotProcessedYet, 
        ROUND((COUNT(CASE WHEN SS.Status IN (5, 6)
              THEN SS.ID END)/COUNT(SS.ID))*100,2) AS PercentNotProcessedYet, 
        COUNT(CASE WHEN SS.Status = 3
              THEN SS.ID END) AS CountProcessing, 
        ROUND((COUNT(CASE WHEN SS.Status = 3
              THEN SS.ID END)/COUNT(SS.ID))*100,2) AS PercentProcessing
    FROM DBO.WorkingSession AS SS
    JOIN DBO.Location AS LOC ON SS.LocationID = LOC.LocationID AND SS.BranchCode = LOC.BranchCode
    JOIN DBO.Status AS ST ON SS.Status = ST.ID
    GROUP BY LOC.SubCompanyNameVN, LOC.BranchName, LOC.BranchCode
    ORDER BY LOC.SubCompanyNameVN

首先关于您收到的错误消息,您不能在同一级别上引用像这样的列别名。

CountProcessing/Total

您可以使用 CTE 或派生查询来计算 TotalCountProcessing,然后使用列别名在外部查询上计算 Percent

您可以使用 CASE 表达式而不是子查询来简化您的查询

SELECT
    LOC.SubCompanyNameVN,
    LOC.BranchName,
    COUNT(LOC.BranchCode) as [Total],
    SUM (CASE WHEN SS.Status IN (5,6) THEN 1 ELSE 0 END) as [CountNotProcessedYet],
    SUM (CASE WHEN SS.Status IN (3)   THEN 1 ELSE 0 END) as [CountProcessing],
    ROUND (SUM (CASE WHEN SS.Status IN (3)   THEN 1 ELSE 0 END) * 100.0 / COUNT(LOC.BranchCode), 2) as [Percent]
FROM DBO.WorkingSession AS SS
JOIN DBO.Location AS LOC ON SS.LocationID = LOC.LocationID AND SS.BranchCode = LOC.BranchCode
JOIN DBO.Status AS ST ON SS.Status = ST.ID
GROUP BY LOC.SubCompanyNameVN, LOC.BranchName
ORDER BY LOC.SubCompanyNameVN

您不能在该过程的一个步骤中同时为列命名和为计算列使用相同的名称。如下所示更改您的查询

ALTER PROCEDURE GetReportData
AS
BEGIN
  SELECT
    SubCompanyNameVN,
    BranchName,
    Total,
    CountNotProcessedYet,
    ROUND((CountNotProcessedYet/Total)*100,2),
    CountProcessing,
    ROUND((CountProcessing/Total)*100,2)
  FROM
    (SELECT 
        LOC.SubCompanyNameVN,
        LOC.BranchName,
        COUNT(LOC.BranchCode) as Total,

        ----------- Not Processed Yet
        -- Count
        (SELECT COUNT(WS.ID)
            FROM DBO.WorkingSession AS WS
            JOIN DBO.Location AS LO ON WS.LocationID = LO.LocationID AND WS.BranchCode = LO.BranchCode
            WHERE WS.Status = 5 OR WS.Status = 6 AND LO.BranchCode = LOC.BranchCode) AS CountNotProcessedYet,
        ----------- Processing
        -- Count
        (SELECT COUNT(WS.ID)
            FROM DBO.WorkingSession AS WS
            JOIN DBO.Location AS LO ON WS.LocationID = LO.LocationID AND WS.BranchCode = LO.BranchCode
            WHERE WS.Status = 3 AND LO.BranchName = LOC.BranchName) AS CountProcessing,
       
    FROM DBO.WorkingSession AS SS
    JOIN DBO.Location AS LOC ON SS.LocationID = LOC.LocationID AND SS.BranchCode = LOC.BranchCode
    JOIN DBO.Status AS ST ON SS.Status = ST.ID
    GROUP BY LOC.SubCompanyNameVN, LOC.BranchName, LOC.BranchCode) T
  ORDER BY LOC.SubCompanyNameVN
END