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

时间:2014-02-20 14:54:27

标签: 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 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

2 个答案:

答案 0 :(得分: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 - &gt; inner join
  • 修复了表名旁边的子查询的语法。
  • 删除了名和姓的列。它们没有被使用。
  • 将子查询更改为包含agent_id
  • agent_idfirst_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进行数据分析。
  6. ”中

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

答案 1 :(得分: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

子查询在很大程度上是邪恶的。这里没有必要,因为你可以从连接中获取列。