2017-04-01 70 views
-1

我有一個查詢:如何總結在連接表的分組數據使用子查詢兩列

SELECT COUNT(*) as Avalied 
FROM PY_LeaveTransactionMasterTAB as lm 
JOIN PY_LeaveTransactionSubsidaryTAB as ls 
ON lm.LV_TransMasterId = ls.LV_TransMasterId 
WHERE lm.SystemCode = 'faheem123' AND lm.EmployeeCode = '0014' AND lm.Status ='Approved' 
Group by lm.Status 

上面的查詢返回:

Availed 
------- 
    3 

和另一個查詢:

SELECT PY_Leave + CY_Leave as Openning 
FROM PY_LeaveOpeningTAB 
WHERE SystemCode = 'faheem123' and EmployeeCode = '0014' 

此查詢返回:

Openning 
-------- 
    25 
    23 
    30 

我想上面的兩個查詢相結合,得到如下結果:

Openning Availed 
-------- -------- 
    25   3 
    23   0 
    30   0 

如何實現上述結果呢?謝謝:)

+1

爲什麼你不想要的「3」'Availed'所有三排? –

回答

0

對我來說,你會想在一行「3」,而在其他行「0」沒有意義。你可以做這樣的事情:

SELECT (PY_Leave + CY_Leave) as Openning, 
     (CASE WHEN PY_Leave + CY_Leave = 25 THEN x.Avalied ELSE 0 END) as Avalied 
FROM PY_LeaveOpeningTAB lo CROSS JOIN 
    (SELECT COUNT(*) as Avalied 
     FROM PY_LeaveTransactionMasterTAB lm JOIN 
      PY_LeaveTransactionSubsidaryTAB as ls 
      ON lm.LV_TransMasterId = ls.LV_TransMasterId 
     WHERE lm.SystemCode = 'faheem123' AND lm.EmployeeCode = '0014' AND 
      lm.Status ='Approved' 
    ) x 
WHERE lo.SystemCode = 'faheem123' and lo.EmployeeCode = '0014'; 

正如我說的,它更有意義(我)去除CASE,把「3」在所有三個「匹配」行。

+0

對於數值'25'的'Openning',在'PY_LeaveTransactionSubsidaryTAB'表中有3行計數,對於其他在'PY_LeaveTransactionSubsidaryTAB'表中沒有行數的數據,這就是爲什麼我要爲他們顯示'0',你的查詢將會如果'Openning'是'25',總是返回'0',我想顯示相應的行數,如果沒有,則顯示'0'。 –

0

你可以嘗試使用CTE

WITH CTE_preselect AS (
SELECT EmployeeCode,PY_Leave + CY_Leave as Openning 
FROM PY_LeaveOpeningTAB 
WHERE SystemCode = 'faheem123' and EmployeeCode = '0014' 
) 

SELECT Openning,COUNT(*) as Avalied 
FROM PY_LeaveTransactionMasterTAB as lm 
JOIN PY_LeaveTransactionSubsidaryTAB as ls 
ON lm.LV_TransMasterId = ls.LV_TransMasterId 
JOIN CTE_preselect ON lm.EmployeeCode = CTE_preselect.EmployeeCode 
WHERE lm.SystemCode = 'faheem123' AND lm.EmployeeCode = '0014' AND 
lm.Status ='Approved' 
Group by Openning,lm.Status 
0

假設Availed「屬於」第一行

Select A.Opening 
     ,Availed = case when A.RN=1 then B.Availed else 0 end) 
From (
     SELECT PY_Leave + CY_Leave as Openning 
       ,RN = Row_Number() over (Order by (Select NULL)) 
     FROM PY_LeaveOpeningTAB 
     WHERE SystemCode = 'faheem123' and EmployeeCode = '0014' 
    ) A 
Cross Join (
       SELECT COUNT(*) as Avalied 
       FROM PY_LeaveTransactionMasterTAB as lm 
       JOIN PY_LeaveTransactionSubsidaryTAB as ls 
       ON lm.LV_TransMasterId = ls.LV_TransMasterId 
       WHERE lm.SystemCode = 'faheem123' AND lm.EmployeeCode = '0014' AND lm.Status ='Approved' 
       Group by lm.Status 
      ) B 
相關問題