Sql 查询每个相关客户的最大发票,而不是该客户的每个发票

Sql 查询每个相关客户的最大发票,而不是该客户的每个发票,sql,sql-server-2012,greatest-n-per-group,Sql,Sql Server 2012,Greatest N Per Group,我需要编写一个查询,以显示阿拉巴马州每位客户(包括阿拉巴马州从未进行过购买的任何客户;他们的发票日期应为空,发票总额应显示为0)的最大购买的客户代码、客户名、姓氏、完整地址、发票日期和发票总额 我不明白为什么,尽管使用了不同的lgcustomer.cust_代码以及MAX(inv_total),它仍然返回该客户的每个inv_total 我的教授说要使用UNION,但据我所知,这是为了编译两个具有相同属性的不同表 我感谢任何能为我指明正确方向的回复 解决方案 我们在课堂上得到的答案是使用相关子

我需要编写一个查询,以显示阿拉巴马州每位客户(包括阿拉巴马州从未进行过购买的任何客户;他们的发票日期应为空,发票总额应显示为0)的最大购买的客户代码、客户名、姓氏、完整地址、发票日期和发票总额

我不明白为什么,尽管使用了不同的lgcustomer.cust_代码以及MAX(inv_total),它仍然返回该客户的每个inv_total

我的教授说要使用UNION,但据我所知,这是为了编译两个具有相同属性的不同表

我感谢任何能为我指明正确方向的回复

解决方案

我们在课堂上得到的答案是使用相关子查询和并集

select c.cust_code
      ,cust_fname
      ,cust_lname
      ,cust_street
      ,cust_city
      ,cust_state
      ,inv_date
      ,inv_total
from lgcustomer c left outer join lginvoice i on c.cust_code = i.cust_code
where cust_state = 'AL'
and inv_total = (select max(inv_total)
                 from lginvoice i2
                 where i2.cust_code = c.cust_code)

union
select c.cust_code
      ,cust_fname
      ,cust_lname
      ,cust_street
      ,cust_city
      ,cust_state
      ,''
      ,0

from lgcustomer c left outer join lginvoice i on c.cust_code = i.cust_code
where cust_state = 'AL'
and inv_date is null
and inv_total is null
order by cust_lname asc

您的查询不会返回该客户的每个
inv_total
,只返回客户订购某物时每天的总计。如果您从
分组依据
和选择列表中删除日期,每个客户都会得到一行。太好了!我想我的下一个问题是,如果不能包含在group by中,如何添加最大发票发生的日期。有几种方法。你能把你的查询粘贴到问题中吗?因为很难从图像中输入?确保粘贴的SQL的每一侧都有一个空行,然后选择粘贴的查询,并单击编辑器中的
{}
按钮。这将放置正确的格式。这里回答了类似的问题。Link-->您已将其标记为“最大n个/组”。这是一个众所周知的术语,有一些众所周知的解决方案,如外部应用和行数。
select c.cust_code
      ,cust_fname
      ,cust_lname
      ,cust_street
      ,cust_city
      ,cust_state
      ,inv_date
      ,inv_total
from lgcustomer c left outer join lginvoice i on c.cust_code = i.cust_code
where cust_state = 'AL'
and inv_total = (select max(inv_total)
                 from lginvoice i2
                 where i2.cust_code = c.cust_code)

union
select c.cust_code
      ,cust_fname
      ,cust_lname
      ,cust_street
      ,cust_city
      ,cust_state
      ,''
      ,0

from lgcustomer c left outer join lginvoice i on c.cust_code = i.cust_code
where cust_state = 'AL'
and inv_date is null
and inv_total is null
order by cust_lname asc