2015-11-05 115 views
2

我有以下兩個SQL語句(使用SQL Server 2014)從兩個SQL語句合併結果到一個呈現出新的結果

SELECT 
    EMP_CLASS_1 
    ,SUM(TOT_MI/60) AS [Absent hours] 
FROM [TestData].[dbo].[Absenteeism and SLWP TCS Data] 
WHERE CODE = 'MLSKU' OR CODE = 'UNPDAB' OR CODE = 'UNPADH' 
GROUP BY EMP_CLASS_1 
ORDER BY EMP_CLASS_1 

和第二

SELECT 
    EMP_CLASS_1 
    ,SUM(TOT_MI/60) AS [Schedule Hours] 
FROM [TestData].[dbo].[Absenteeism and SLWP TCS Data] 
WHERE code = 'attend' 
GROUP BY EMP_CLASS_1 
ORDER BY EMP_CLASS_1 

什麼我想do是從第一個陳述中得出結果並將其除以第二個陳述的結果。

到目前爲止,我沒有得到任何運氣。

我對此非常青睞,請耐心等待。

在此先感謝您提供的任何幫助。

作爲第二個問題,如果可能的話,我想在三個獨立的列中一次顯示所有三個結果。

回答

1

假設你有相應的兩個查詢之間的行可以使用JOIN

WITH cte1 AS 
(
    SELECT EMP_CLASS_1 
    ,SUM(TOT_MI/60) AS [Absent hours] 
    FROM [TestData].[dbo].[Absenteeism and SLWP TCS Data] 
    WHERE CODE IN('MLSKU' ,'UNPDAB' , 'UNPADH') 
    GROUP BY EMP_CLASS_1 
), cte2 AS 
(
    SELECT EMP_CLASS_1 
    ,SUM(TOT_MI/60) AS [Schedule Hours] 
    FROM [TestData].[dbo].[Absenteeism and SLWP TCS Data] 
    WHERE code = 'attend' 
    GROUP BY EMP_CLASS_1 
) 
SELECT c1.EMP_CLASS_1 
     ,c1.[Absent hours] 
     ,c2.[Schedule Hours] 
     ,[result] = c1.[Absent hours]/c2.[Schedule Hours] 
FROM cte1 c1 
JOIN cte2 c2 
    ON c1.EMP_CLASS_1 = EMP_CLASS_1 

或更簡單:

SELECT EMP_CLASS_1 
    ,SUM(IIF(CODE IN('MLSKU' ,'UNPDAB' , 'UNPADH'), TOT_MI, 0) /60) AS [Absent hours] 
    ,SUM(IIF(CODE ='attend', TOT_MI, 0) /60) AS [Schedule Hours] 
    ,SUM(IIF(CODE IN('MLSKU' ,'UNPDAB' , 'UNPADH'), TOT_MI, 0) /60) 
    /SUM(IIF(CODE ='attend', TOT_MI, 0) /60) AS [result] 
FROM [TestData].[dbo].[Absenteeism and SLWP TCS Data] 
WHERE CODE IN ('MLSKU' ,'UNPDAB' , 'UNPADH','attend') 
GROUP BY EMP_CLASS_1 
ORDER BY EMP_CLASS_1; 
+0

謝謝lad2025 - 仍然努力學習SQL。我非常感謝你抽出時間幫助我。 – rasmac

+0

@rasmac我問你爲什麼先接受我的答案,然後不接受?我的答案早些時候+與上面的字面意思相同+ IIF是CASE陳述的縮寫形式?新接受的答案並不像你寫的那樣完整:「如果可能的話,作爲第二個問題,我想在三個獨立的列中同時顯示所有三個結果。這種行爲對我來說很奇怪。如果您需要額外的解釋,請發表評論。 – lad2025

+0

@rasmac我會得到答案嗎? – lad2025

0

既然你在同一列查詢相同的表和分組,您可以通過加入where條款來實現此目的,以便它們包含兩組相關行,並在原始條件下對case陳述應用sum

注意,順便說一句,第一查詢的where條款可以更優雅的使用in操作寫成:

SELECT emp_class_1, 
     SUM(CASE WHEN code IN ('MLSKU', 'UNPDAB', 'UNPADH') THEN tot_mi/60 END)/
     SUM(CASE code WHEN 'attend' THEN tot_mi/60 END) 
FROM  [TestData].[dbo].[Absenteeism and SLWP TCS Data] 
WHERE code IN ('MLSKU', 'UNPDAB', 'UNPADH', 'attend') 
GROUP BY emp_class_1 
ORDER BY emp_class_1 
+0

謝謝Mureinik – rasmac