计算百分比 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
或派生查询来计算 Total
和 CountProcessing
,然后使用列别名在外部查询上计算 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
我有一个存储过程:
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
或派生查询来计算 Total
和 CountProcessing
,然后使用列别名在外部查询上计算 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