簡體   English   中英

SQL:侵入性較小的方法來查找兩個不同的列之間的差異

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM