2016-03-10 36 views
0

我有以下SQL:SQL查詢語句由錯誤造成因組(列無效)

DECLARE @EmpId AS Varchar(20), 
      @CompanyId as VARCHAR(20), 
      @DepartmentId AS VARCHAR(20), 
      @DesignationId AS VARCHAR(20), 
      @GradeId AS VARCHAR(20), 
      @FromDate AS DATE, 
      @TillDate AS DATE 

SET @EmpId = null 
SET @CompanyId = NULL 
SET @DepartmentId = NULL 
SET @DesignationId = NULL 
SET @GradeId = NULL 
SET @FromDate = '1-1-2015' 
SET @TillDate = '1-1-2016' 

SELECT 
    LA.EmpId,AT.IsPaid AS 'IsPaid', 
    AT.AttendanceTypeCode, 
    (SELECT DISTINCT IsPaid 
    FROM LeaveApproval 
    WHERE empid = LA.EmpId) AS 'testPAID', 
    SUM(CASE WHEN AT.IsPaid = 1 THEN 1 END) AS Paid, 
    COUNT(CASE WHEN AT.IsPaid = 0 THEN AT.AttendanceTypeCode END) AS UnPaid, 
    COUNT(AT.AttendanceTypeCode) AS LeaveCount 
FROM 
    LeaveApproval LA 
INNER JOIN 
    AttendanceTypes AT ON LA.AttendanceTypeId = AT.AttendanceTypeId 
INNER JOIN 
    EmpMaster EM ON LA.Empid = EM.EmpId 
WHERE 
    EM.ActiveInActive <> 1 AND 
    EM.EmpId = CASE WHEN ISNULL(@EmpId ,'-1') <> '-1' AND @EmpId <> '' 
         THEN @EmpId 
         ELSE EM.EmpId 
       END 
    AND EM.CompanyId = CASE WHEN ISNULL(@CompanyId ,'-1') <> '-1' AND @CompanyId <>  '' 
           THEN @CompanyId 
           ELSE EM.CompanyId 
         END 
    AND EM.DepartmentId = CASE WHEN ISNULL(@DepartmentId,'-1') <> '-1' AND @DepartmentId<> '' 
           THEN @DepartmentId 
           ELSE EM.DepartmentId 
          END 
    AND ISNULL(EM.DesignationId, '') = CASE WHEN ISNULL(@DesignationId ,'-1') <> '-1' AND @DesignationId <> '' THEN @DesignationId ELSE ISNULL(EM .DesignationId,'') END 
    AND ISNULL(EM.GradeId,'') = CASE WHEN ISNULL(@GradeId ,'-1') <> '-1' AND @GradeId <> '' THEN @GradeId ELSE ISNULL(EM .GradeId,'') END 
    AND FromDate BETWEEN @FromDate AND @TillDate 
GROUP BY 
    LA.EmpID, AT.AttendanceTypeCode, AT.IsPaid, Paid, UnPaid 

以上SQL是行不通的。

我得到一個錯誤

PaidInPaid無效。

我知道'付費'和Unpaid來自子查詢並且不能在選擇列表的組中使用。

我的問題是如何才能實現上述結果運行我的SQL我的成果應該重複相同的值,該值總和Paid每個empid

任何幫助將不勝感激

+0

你沒有在'case'語句中指定其他部分可能導致問題'SUM(CASE WHEN AT.IsPaid = 1 Then 1 else END)as'付費' – Harsh

+2

' ELSE'是可選的。當沒有指定ELSE時,隱含「ELSE NULL」。 – Andrew

回答

2

不能使用別名後當前的SELECT的列在其GROUP BY中。你必須做這一點:

Group By LA.EmpID,AT.AttendanceTypeCode,AT.IsPaid,SUM(CASE WHEN AT.IsPaid=1 Then 1 END), COUNT(CASE WHEN AT.IsPaid=0 Then AT.AttendanceTypeCode END) 

或者使用所有的SELECT作爲一個子查詢和組由如您在外部查詢計劃。

+0

此解決方案是否適合您,@Alex? – Andrew

0
DECLARE @EmpId AS Varchar(20), 
    @CompanyId as VARCHAR(20), 
    @DepartmentId AS VARCHAR(20), 
    @DesignationId AS VARCHAR(20), 
    @GradeId AS VARCHAR(20), 
    @FromDate AS DATE, 
    @TillDate AS DATE 



Set @EmpId=null 
SET @CompanyId= NULL 
SET @DepartmentId=NULL 
SET @DesignationId=NULL 
SET @GradeId=NULL 
SET @FromDate='1-1-2015' 
SET @TillDate='1-1-2016'; 

with LeaveApprovalCTE as 
(
Select 
    AT.IsPaid as 'IsPaid', 
    AT.AttendanceTypeCode, (select distinct IsPaid from LeaveApproval where empid=LA.EmpId) as 'testPAID', 
CASE WHEN AT.IsPaid=1 Then 1 END as Paid, 
CASE WHEN AT.IsPaid=0 Then AT.AttendanceTypeCode END as UnPaid, 
AT.AttendanceTypeCode AS LeaveCount 
From 
LeaveApproval LA 
INNER JOIN AttendanceTypes AT ON LA.AttendanceTypeId = AT.AttendanceTypeId 
INNER JOIN EmpMaster EM ON LA.Empid = EM.EmpId 

WHERE 
EM.ActiveInActive <> 1 AND 
EM.EmpId = CASE WHEN ISNULL(@EmpId ,'-1') <> '-1' AND @EmpId <> '' THEN @EmpId ELSE EM .EmpId END 
AND 
EM.CompanyId = CASE WHEN ISNULL(@CompanyId ,'-1') <> '-1' AND @CompanyId <>  '' THEN @CompanyId ELSE EM .CompanyId END 
AND 
EM.DepartmentId = CASE WHEN ISNULL(@DepartmentId,'-1') <> '-1' AND @DepartmentId<> '' THEN @DepartmentId ELSE EM .DepartmentId END 
AND 
ISNULL(EM.DesignationId,'') = CASE WHEN ISNULL(@DesignationId ,'-1') <> '-1' AND @DesignationId <> '' THEN @DesignationId ELSE ISNULL(EM .DesignationId,'') END 
AND 
ISNULL(EM.GradeId,'') = CASE WHEN ISNULL(@GradeId ,'-1') <> '-1' AND @GradeId <> '' THEN @GradeId ELSE ISNULL(EM .GradeId,'') END 
AND 
FromDate BETWEEN @FromDate AND @TillDate 
) 

Select 
AttendanceTypeCode, 
SUM(Paid) as paid , 
COUNT(UnPaid) as unpaid, 
COUNT(LeaveCount) AS LeaveCount 

from LeaveApprovalCTE 

Group By AttendanceTypeCode,IsPaid,Paid,UnPaid 

使用CTE在查詢中添加新列。像這樣修改你的查詢。希望它能爲你工作