Sql server 如何在联接表的分组数据中使用子查询对两列求和
我有一个疑问:Sql server 如何在联接表的分组数据中使用子查询对两列求和,sql-server,database,tsql,Sql Server,Database,Tsql,我有一个疑问: 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 ='Approve
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
我如何实现上述结果?谢谢:)我不认为您希望一行显示“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';
正如我所说的,(对我来说)删除
案例并将“3”放在所有三个“匹配”行上更有意义。您可以尝试使用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
假设可用的“属于”第一行
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
为什么您不希望所有三行上的可用都使用“3”
呢?对于打开值25
的PY_LeaveTransactionSubsidaryTAB
表中有3行计数,而对于其他行,在PY_LeaveTransactionSubsidaryTAB
表中找不到行计数,这就是为什么我要为它们显示0
,您的查询将始终返回可用的0
,如果Openning
是25
,我想显示相应的行计数(如果找到),如果没有,则显示0
。