[英]SQL: Less invasive way to find difference between two distinct columns
我專門針對SQL Server,但是如果MySQL也存在此信息,將對您有所幫助。 我已經找到了如何創建一列來計算兩個連續行的列之間的差異,但是我感興趣的是如何計算兩個可明確識別的行中的一列之間的差異?
我知道一種方法,但它需要深度查詢嵌套和重復相同的基本查詢。 假設我有一個連接多個表的大型查詢,最終將其歸結為:
SELECT
projectStatus AS [Project Status],
COUNT(projectStatus) AS [# of Projects]
FROM
projectList
GROUP BY projectStatus
假設它給出以下結果:
Project Status | # of Projects
------------------------------
Delayed | 167
Delayed Known | 83
On Time | 92
Ahead | 86
我想做的是追加一行,計算“延遲”和“延遲已知”行的“項目數”值之間的差,然后省略“延遲”行,如下所示:
Project Status | # of Projects
------------------------------
Delayed | 167
Delayed Known | 83
On Time | 92
Ahead | 86
Delayed Unknown| 84
根據第一個查詢,我弄清楚如何執行此操作的方式如下所示:
SELECT
projectStatus AS [Project Status],
COUNT(projectStatus) AS [# of Projects]
FROM
projectList
GROUP BY projectStatus
UNION
SELECT
'Delayed Unknown' AS [Project Status],
SUM([Sum Val]) AS [# of Projects]
FROM (
SELECT
[# of Projects] *
CASE
WHEN [Project Status] = 'Delayed' THEN 1
WHEN [Project Status] = 'Delayed Known'] THEN -1
ELSE 0
END AS [Sum Val]
FROM (
SELECT
projectStatus AS [Project Status],
COUNT(projectStatus) AS [# of Projects]
FROM
projectList
WHERE
projectStatus IN ('Delayed', 'Delayed Known')
GROUP BY projectStatus
) AS queryC
) AS queryB
請記住 ,本文簡化了基於該查詢的內部查詢,但實際上它是一個更大的查詢,由它自己的UNION
組成。 因此,這變得非常丑陋並接近難以維持的狀態。
該查詢的目標是充當SQL Server Reporting Services的數據集,因此我的約束是在一個查詢中完成所有這些操作 (除非可以在SSRS數據集中使用臨時表)。 因此,在一個查詢中, 是否存在一種侵入性較小的方法來進行此計算?
請嘗試此操作,可能是您正在尋找以下類似內容。
;with cte as(
select Projectstatus, count(*) as [# of Projects]
from @Table
where projectStatus IN ('Delayed', 'Delayed Known')
group by ProjectStatus
), cte2 as(
select
(Select [# of Projects] From cte Where Projectstatus = 'Delayed')
-(Select [# of Projects] From cte Where Projectstatus = 'Delayed Known') as DelayedUnKownProjects
)
select Projectstatus, [# of Projects]
From cte
UNION ALL
SELECT 'Delayed UnKnown' as Projectstatus, DelayedUnKownProjects as [# of Projects]
From cte2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.