2014-02-20 38 views
0

我想运行一个查询,它会给我一个Sum函数,然后选择连接表中的两列,然后通过组合该数据我给他们的唯一身份证。这是我的原始查询,它的工作原理。试图选择多个列的内部联接查询与组和where子句

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 

我已经尝试了下面的查询,但我不断收到一个错误,我不知道为什么。它说它有一个语法错误。

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

你有两个点从[Intern_DB2] .. [RealEstateAgentList]应该只有一个 – jle

+0

实际上,这两个点是正确的。他们可以(也可能应该)在他们之间放置一个[dbo],但这不是必要的。 –

回答

2

你的查询有多个问题:

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; 

这里有一些变化:

  • INNERJOIN - >inner join
  • 修复了表名旁边的子查询语法。
  • 删除名字和姓氏的列。他们没有使用。
  • 将子查询更改为包含agent_id
  • 已将agent_id,first_namelast_name添加到外部聚合,因此您可以知道值来自哪里。
  • 将日期格式更改为较不明确的标准格式。
  • 为子查询添加表别名。

我怀疑代理列表上的子查询并不重要。你或许可以这样做:

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; 

编辑:

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

  1. 使用表名称的缩写表。
  2. 引用列时始终使用表别名。
  3. 使用日期常量时,请使用“YYYY-MM-DD”格式或使用convert()来使用指定的格式转换字符串。 (后者实际上是更安全的方法,但前者更方便,并可在几乎所有数据库中使用。)
  4. 注意错误消息;他们可以在SQL Server中提供信息(不幸的是,其他数据库不太清楚)。
  5. 格式化您的查询如此其他人们可以理解它。这将有助于您理解和调试您的查询。我有一个非常特别的格式化样式(在这一点上没有人会改变);重要的不是特定的风格,而是能够“查看”查询所做的事情。我的风格在我的书“使用SQL和Excel的数据分析”中有记录。

还有其他规则,但这些是开始的好方法。

+0

很好的答案。我一直在编辑我的内容,因为我一直在原始查询中发现问题。我最终删除了我的答案,因为我认为你的总结得非常好,并且完全删除子查询的最终建议比我试图在保留查询的同时修复查询更好。 –

+0

完美的答案!谢谢你,我正在进行一场试火,你们是一个巨大的帮助! –

+0

Gordon, 谢谢指点!这就是为什么我来堆栈溢出,向我的宝贝学习,谢谢。 :) –

0
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 

这就是查询的样子......但是,如果您子查询名和姓,您还必须将它们包括在组中。假设Close_Date是在PaymentList表,这是我会怎么写查询:

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 

子查询是邪恶的,大部分。这里不需要一个,因为你可以从连接中获取列。