簡體   English   中英

sql-server:將這兩個查詢結果合並為1

[英]sql-server: Combing these 2 queries results into 1

我有這兩個創建排名列表的查詢,然后從結果中選擇特定的行,因此兩個查詢均返回1值。 如何合並結果,以便將它們一起返回。 符合邏輯的東西:

SELECT x.a, y.b FROM (SELECT * from a) as x, (SELECT * FROM b) as y

查詢1

declare @MainHospital varchar(50)='Hospital1';

                               WITH cte AS (
                               SELECT 4 score, growth1 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 3 score, growth2 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 2 score, growth3 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 1 score, growth4 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 0 score, growth5 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               ),

                                cte2 AS (
                               SELECT area, SUM(score) score FROM cte
                               GROUP BY area
                               HAVING area IS NOT NULL                                   
                               ),

                                cte3 AS (
                               SELECT area, score, 
                               Row_Number() OVER (ORDER BY score DESC) row,
                               RANK() OVER (ORDER BY score DESC) rank
                               FROM cte2
                               )                                   

                               SELECT top 1 area AS Growth
                               FROM cte3
                               WHERE row = 1

query2

                               WITH Ecte AS (
                               SELECT 4 score, Efficiency1 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 3 score, Efficiency2 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 2 score, Efficiency3 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 1 score, Efficiency4 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               UNION ALL
                               SELECT 0 score, Efficiency5 area FROM Survey
                               WHERE MainHospital = @MainHospital
                               ), Ecte2 AS (
                               SELECT area, SUM(score) score FROM Ecte
                               GROUP BY area
                               HAVING area IS NOT NULL                                  

                               ), Ecte3 AS (
                               SELECT area, score, 
                               Row_Number() OVER (ORDER BY score DESC) row,
                               RANK() OVER (ORDER BY score DESC) rank
                               FROM Ecte2
                               )
                               SELECT TOP 1 area as Efficiency
                               FROM Ecte3
                               WHERE row = 1

您是否看過UNION / UNION ALL 您必須在每個返回中具有相同的列數,此功能才能起作用。

例如:

SELECT COL1, COL2, COL3 FROM TABLE1
UNION ALL
SELECT COL1, COL2, COL3 FROM TABLE2

對於CTE,請執行以下操作:

;WITH CTE1 (col1, col2)
AS
(
     SELECT col1, col2
     FROM ...
)
, CTE2 (col1, col2)
AS
(
     SELECT col1, col2
     FROM ....
)

SELECT col1, col2
FROM CTE1
WHERE something = true
UNION ALL
SELECT col1, col2
FROM CTE2
WHERE something = true

注意: UNION ALL將返回重復的行, UNION將消除相同的行,就好像所選的每一列上的GROUP BY

您的代碼將更改如下:

declare @MainHospital varchar(50)='Hospital1';

WITH cte AS (
SELECT 4 score, growth1 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 3 score, growth2 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 2 score, growth3 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 1 score, growth4 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 0 score, growth5 area FROM Survey
WHERE MainHospital = @MainHospital
),

cte2 AS (
SELECT area, SUM(score) score FROM cte
GROUP BY area
HAVING area IS NOT NULL                                   
),

cte3 AS (
SELECT area, score, 
Row_Number() OVER (ORDER BY score DESC) row,
RANK() OVER (ORDER BY score DESC) rank
FROM cte2
),                                 

Ecte AS (
SELECT 4 score, Efficiency1 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 3 score, Efficiency2 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 2 score, Efficiency3 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 1 score, Efficiency4 area FROM Survey
WHERE MainHospital = @MainHospital
UNION ALL
SELECT 0 score, Efficiency5 area FROM Survey
WHERE MainHospital = @MainHospital
), Ecte2 AS (
SELECT area, SUM(score) score FROM Ecte
GROUP BY area
HAVING area IS NOT NULL                                  

), Ecte3 AS (
SELECT area, score, 
Row_Number() OVER (ORDER BY score DESC) row,
RANK() OVER (ORDER BY score DESC) rank
FROM Ecte2
)

SELECT TOP 1 area as Efficiency
FROM Ecte3
WHERE row = 1                              
UNION ALL
SELECT top 1 area AS Growth
FROM cte3
WHERE row = 1

如果要同時使用兩個值,請將最終查詢更改為此:

SELECT TOP 1 T1.area as Efficiency, T2.area AS Growth
FROM Ecte3 T1, cte3 T2
WHERE T1.row = 1 AND T2.row = 1                            

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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