2017-04-01 68 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 
相关问题