使用CASE和GROUP BY的SQL Server查询,字段无效?

时间:2013-10-18 22:51:01

标签: sql sql-server group-by case

无法弄清楚我在这里做错了什么。它表示字段HasNoteDate无效。我只是希望它返回1,如果有一个日期,0如果没有,我希望它分组,所以我可以得到计数和贷款金额的总和。我已经查看了stackoverflow的答案,用于按案例分组,但没有人为我解决它。谢谢!

SELECT    dbo.BDONAMES.UserID, dbo.BRKRMAST.Tier, dbo.BDONAMES.REGION, COUNT(*) AS TierRegionCount, 
                      SUM(dbo.LOAN.LOAN_AMT) AS LoanAmtSum, dbo.LOAN.DEAL_STATUS, CASE WHEN dbo.WORKFLOW.NOTE_DATE IS NULL 
                      THEN 0 ELSE 1 END AS HasNoteDate
FROM         dbo.BRKRMAST INNER JOIN
                      dbo.BRKRREF ON dbo.BRKRMAST.BRKRMASTID = dbo.BRKRREF.BRKRMASTID INNER JOIN
                      dbo.LOAN ON dbo.BRKRREF.LoanId = dbo.LOAN.LoanId INNER JOIN
                      dbo.WORKFLOW ON dbo.LOAN.LoanId = dbo.WORKFLOW.LoanId LEFT OUTER JOIN
                      dbo.BDONAMES ON dbo.BRKRMAST.BDONAMESID = dbo.BDONAMES.BDONAMESID
WHERE     (LEN(dbo.BDONAMES.UserID) > 0) AND (dbo.BRKRMAST.Tier > 0) AND (LEN(dbo.BDONAMES.REGION) > 0)
GROUP BY dbo.BDONAMES.UserID, dbo.BRKRMAST.Tier, dbo.BDONAMES.REGION, dbo.LOAN.LOAN_AMT, dbo.LOAN.DEAL_STATUS, HasNoteDate
ORDER BY dbo.BDONAMES.UserID, dbo.BRKRMAST.Tier, dbo.BDONAMES.REGION

2 个答案:

答案 0 :(得分:2)

SQL查询执行的逻辑并不像通用编程语言那样简单

以下是查询的示例执行阶段:

  1. FROM CLAUSE
  2. 中的表格上执行联接
  3. 执行GROUP BY - 这会导致错误,因为此时未定义HasNoteDate
  4. 执行ORDER BY
  5. 执行SELECT - 仅在此阶段定义了列HasNoteDate
  6. 所以,您不能在GROUP BY中使用未定义的列HasNoteDate,您必须将其替换为您的语句(CASE WHEN dbo.WORKFLOW.NOTE_DATE IS NULL THEN 0 ELSE 1 END),然后sql server将能够GROUP

答案 1 :(得分:1)

SELECT    dbo.BDONAMES.UserID, dbo.BRKRMAST.Tier, dbo.BDONAMES.REGION, COUNT(*) AS TierRegionCount, 
                      SUM(dbo.LOAN.LOAN_AMT) AS LoanAmtSum, dbo.LOAN.DEAL_STATUS, CASE WHEN dbo.WORKFLOW.NOTE_DATE IS NULL 
                      THEN 0 ELSE 1 END AS HasNoteDate
FROM         dbo.BRKRMAST INNER JOIN
                      dbo.BRKRREF ON dbo.BRKRMAST.BRKRMASTID = dbo.BRKRREF.BRKRMASTID INNER JOIN
                      dbo.LOAN ON dbo.BRKRREF.LoanId = dbo.LOAN.LoanId INNER JOIN
                      dbo.WORKFLOW ON dbo.LOAN.LoanId = dbo.WORKFLOW.LoanId LEFT OUTER JOIN
                      dbo.BDONAMES ON dbo.BRKRMAST.BDONAMESID = dbo.BDONAMES.BDONAMESID
WHERE     (LEN(dbo.BDONAMES.UserID) > 0) AND (dbo.BRKRMAST.Tier > 0) AND (LEN(dbo.BDONAMES.REGION) > 0)
GROUP BY dbo.BDONAMES.UserID, dbo.BRKRMAST.Tier, dbo.BDONAMES.REGION, dbo.LOAN.DEAL_STATUS, CASE WHEN dbo.WORKFLOW.NOTE_DATE IS NULL 
                                                                                                        THEN 0 ELSE 1 END
ORDER BY dbo.BDONAMES.UserID, dbo.BRKRMAST.Tier, dbo.BDONAMES.REGION

按照您在select语句中定义的方式使用组中的列,否则SQL Server会尝试使用SELECT语句中找不到的字段对其进行GROUP,并抛出错误。