Sql 尝试使用group和where子句在内部联接查询中选择多列

Sql 尝试使用group和where子句在内部联接查询中选择多列,sql,sql-server-2012,ssms,Sql,Sql Server 2012,Ssms,我正在尝试运行一个查询,它将给我一个Sum函数,然后从一个联接表中选择两列,然后根据我给它们的唯一id对数据进行分组。这是我最初的查询,它可以正常工作 SELECT Sum (Commission_Paid) FROM [INTERN_DB2].[dbo].[PaymentList] INNER JOIN [INTERN_DB2]..[RealEstateAgentList] ON RealEstateAgentList.AgentID = PaymentList.AgentID WHERE C

我正在尝试运行一个查询,它将给我一个Sum函数,然后从一个联接表中选择两列,然后根据我给它们的唯一id对数据进行分组。这是我最初的查询,它可以正常工作

SELECT Sum (Commission_Paid)
FROM [INTERN_DB2].[dbo].[PaymentList]
INNER JOIN [INTERN_DB2]..[RealEstateAgentList]
ON RealEstateAgentList.AgentID = PaymentList.AgentID
WHERE Close_Date >= '1/1/2013' AND Close_Date <= '12/31/2013'
GROUP BY RealEstateAgentList.AgentID
选择金额(已支付佣金)
来自[INTERN_DB2].[dbo].[PaymentList]
内部连接[INTERN_DB2]…[RealEstateAgentList]
在RealEstateAgentList.AgentID=PaymentList.AgentID上

其中关闭日期>='1/1/2013'和关闭日期='1/1/2013'和关闭日期您的查询存在多个问题:

SELECT rl.AgentId, rl.first_name, rl.last_name, Sum(Commission_Paid)
FROM [INTERN_DB2].[dbo].[PaymentList] pl inner join
     (Select agent_id, min(first_name) as first_name, min(last_name) as last_name
      From [Intern_DB2]..[RealEstateAgentList]
      GROUP BY agent_id
     ) rl
     ON rl.AgentID = pl.AgentID
WHERE Close_Date >= '2013-01-01' AND Close_Date <= '2013-12-31'
GROUP BY rl.AgentID, rl.first_name, rl.last_name;
编辑:

我很高兴这个解决方案有帮助。在继续编写查询时,请尝试始终执行以下操作:

  • 使用表名缩写的表别名
  • 引用列时始终使用表别名
  • 使用日期常量时,请使用“YYYY-MM-DD”格式或使用
    convert()
    以指定格式转换字符串。(后者实际上是更安全的方法,但前者更方便,几乎适用于所有数据库。)
  • 注意错误信息;在SQL Server中,它们可以提供信息(不幸的是,其他数据库不太清楚)
  • 设置查询格式,以便其他人能够理解。这也将帮助您理解和调试查询。我有一个非常特殊的格式风格(现在没有人会改变);重要的不是特定的样式,而是能够“看到”查询在做什么。我的风格记录在我的书《使用SQL和Excel进行数据分析》中
  • 还有其他规则,但这是一个很好的开始

    SELECT Sum (Commission_Paid)
    FROM [INTERN_DB2].[dbo].[PaymentList] pl
    INNER JOIN (
        Select First_Name, Last_Name
        From [Intern_DB2]..[RealEstateAgentList]
        Group By Last_name
    ) x ON x.AgentID = pl.AgentID
    WHERE Close_Date >= '1/1/2013' 
        AND Close_Date <= '12/31/2013'
    GROUP BY RealEstateAgentList.AgentID
    

    大部分情况下,子查询是有害的。这里不需要子查询,因为您可以从连接中获取列。

    您从[Intern_DB2].[RealEstateAgentList]中有两个点,应该只有一个。实际上,这两个点是正确的。它们可以(也可能应该)放一个[dbo]答案很好。我一直在编辑我的答案,因为我一直在原始查询中发现问题。我最终删除了我的答案,因为我认为你的答案总结得很好,你最后提出的完全删除子查询的建议比我在保留查询的同时修复查询的尝试要好。完美的答案!谢谢,我正在接受一场火灾审判,你们帮了我大忙!戈登,谢谢你们的指点!这就是我来stack overflow的原因,向我的上级学习,谢谢。:)
    SELECT rl.AgentId, rl.first_name, rl.last_name, Sum(pl.Commission_Paid)
    FROM [INTERN_DB2].[dbo].[PaymentList] pl inner join
         [Intern_DB2]..[RealEstateAgentList] rl
         ON rl.AgentID = pl.AgentID
    WHERE pl.Close_Date >= '2013-01-01' AND pl.Close_Date <= '2013-12-31'
    GROUP BY rl.AgentID, rl.first_name, rl.last_name;
    
    SELECT Sum (Commission_Paid)
    FROM [INTERN_DB2].[dbo].[PaymentList] pl
    INNER JOIN (
        Select First_Name, Last_Name
        From [Intern_DB2]..[RealEstateAgentList]
        Group By Last_name
    ) x ON x.AgentID = pl.AgentID
    WHERE Close_Date >= '1/1/2013' 
        AND Close_Date <= '12/31/2013'
    GROUP BY RealEstateAgentList.AgentID
    
    SELECT 
        al.AgentID, 
        al.FirstName, 
        al.LastName, 
        Sum(pl.Commission_Paid) AS Commission_Paid
    FROM [INTERN_DB2].[dbo].[PaymentList] pl
    INNER JOIN [Intern_DB2].dbo.[RealEstateAgentList] al ON al.AgentID = pl.AgentID
    WHERE YEAR(pl.Close_Date) = '2013'
    GROUP BY al.AgentID, al.FirstName, al.LastName