2013-10-11 42 views
0

对不起,如果我的标题不是很具描述性,因为我不知道如何解释我需要在标题中的SQL代码。从SQL服务器获得最大的价格

基本上我有2个表格,这个表格包含invoicenumbertotalexvat。 (totalexvat在livedata`表中的所有part_exvatssum

livedata表包含invoicenumberpart_codepart_price

我需要做的是从submissions表返回所有的数据,而且还包括ONLY最昂贵产物在livedata这是part_codepart_price和上invoicenumber

接合两个表一起
submissions 
invoicenumber totalexvat 
1      £123.00 
2      £354.00 
3      £453.00 


livedata 
invoicenumber  part_code  part_price 
1      prt12345   £100.00 
1      prt13643   £20.00 
1      prt63456   £3.00 
2      prt64232   £300.00 
2      prt28258   £54.00 
3      prt64232   £300.00 
3      prt67252   £153.00 

我希望我已经解释得很好,希望有人能帮助我。

回答

0

我通常会做的是添加连接条件,并检查价格是否等于该项目的最高价格,使用子查询。

事情是这样的:

select * 
from submissions s 
inner join livedata l 
    on s.invoicenumber = l.invoicenumber 
    and l.part_price = 
     (select MAX(part_price) 
     from livedata 
     where invoicenumber = l.invoicenumber) 
+0

作品一种享受,三江源:) – Stew

0

所以,你可以使用子查询来实现这一点,但也有几个潜在的问题。子查询会是这个样子:

SELECT submissions.totalexvat 
     ,livedata.part_code 
     ,livedata.part_price 
FROM submissions 
INNER JOIN 
(SELECT invoicenumber 
     ,MAX(part_price) 
FROM livedata 
GROUP BY invoicenumber) ld_max 
ON submissions.invoicenumber = ld_max.invoicenumber 
INNER JOIN livedata 
ON ld_max.invoicenumber = livedata.invoicenumber 
    AND ld_max.part_price = livedata.part_price 

在这个例子中,“ld_max”子查询确定什么价格每发票号码最昂贵的部分。然后,您将返回到livedata表并重新加入以获得与价格相对应的part_code。

潜在的问题是,如果您有多个具有相同价格的零件,并且价格是最高的,那么您将获得最终连接返回的这两个零件。如果这不是所需的行为,(可能是这个问题,这个问题并不清楚),那么你可以通过嵌套子查询并只提取前1个结果来避免这种情况。但是,那么你只是随便拿走其中一个部分而排除其他部分,这似乎不是一个好主意。这也不是一个好主意,因为嵌套子查询本质上是很慢的,所以我会小心这些。

0

你应该使用窗口功能 - 即:row_number()

select * 
from 
(
    select submissions.totalexvat, 
      livedata.part_code, 
      livedata.part_price, 
      row_number() over (partition by submissions.invoicenumber order by part_price desc) rn 
    from 
     submissions 
      inner join livedata on submissions.invoicenumber = livedata.invoicenumber 
) r 
where rn = 1