SQL查询聚合函数有两个表

时间:2016-07-11 08:27:29

标签: sql sql-server database

我正在尝试从SQL查询某些数据,使其汇总一些列,获取其他列的最大值以及另一个表中的相应值。例如,

|表1 |

 |order id| |id|   |shares|  |date|      other stuff
  12345      1       100      05/13/16     XXX
  12345      2       200      05/15/16     XXX
  12345      3       300      06/12/16     XXX
  12345      4       400      02/22/16     XXX
  56789      5       1000     03/30/16     XXX
  56789      6       200      02/25/16     XXX
  22222      7       5000     01/10/16     XXX

|表2 |

 |id|   |price|
  1       21.2
  2       20.2
  3       19.1
  4       21.3
  5       100.0
  6       110.0
  7       5.0

我希望我的输出为:

 |shares|  |date|      |price|   other stuff
  1000      06/12/16    19.1      max(other stuff)
  1200      03/30/16    1000.0    max(other stuff)
  5000      01/10/16    5.0       max(other stuff)

已对股票进行总结,日期为最大值(日期),价格为相应最大值(日期)的价格。

到目前为止,我有:

select 
    orderid, stock, side, exchange, 
    max(startdate), max(enddate),
    sum(shares), sum(execution_price * shares) / sum(shares), 
    max(limitprice), max(price)
from 
    table1 t1
inner join
    table2 t2 on t2.id = t1.id
where 
    location = 'CHICAGO' 
    and startdate > '1/1/2016' 
    and order_type = 'limit'
group by 
    orderid, stock, side, exchange

然而,这会返回:

 |shares|  |date|      |price|   |other stuff|
  1000      06/12/16    21.3      max(other stuff)
  1200      03/30/16    1100.0    max(other stuff)
  5000      01/10/16    5.0       max(other stuff)

这不是max(date)的相应价格。

两个数据集之间唯一的链接是它们的id号,这就是

的原因
inner join
    table2 t2 on t2.id = t1.id

完成了。第二张表中根本没有日期。有什么帮助吗?

感谢。

4 个答案:

答案 0 :(得分:2)

您可以使用子查询解决此问题。您不需要在价格列上使用任何聚合函数,只需查找最大日期然后获取该特定日期的价格。尝试这样的事情..

select t5.*, t4.price
from 
  (select t1.order_id, sum(t1.shares) as shares, max(t1.date) as maxdate, max(other_stuff) as other_stuff
  from Table1 t1
  inner join
  Table2 t2 on t2.id = t1.id    
  group by  t1.order_id) t5

inner join Table1 t3
on t5.maxdate = t3.date and t5.order_id = t3.order_id 
inner join Table2 t4
on t3.id = t4.id;

ONLINE DEMO HERE

答案 1 :(得分:1)

所以,在我给你写一个查询之前,你基本上想要在最大日期期间的价格,对吗?您有MAX的价格,股票总和,最高限价,再次股票等等。

我的猜测是你想要根据最新日期(Max)的最新价格,然后运行最新日期的计算,最新日期的最新股数,以及所有这些的总和?您还要对ID,共享以及其他没有意义的事情进行分组,看起来您可能希望对Shares,Side和Exchange进行分组,而不是ID。看起来你把最大限度放在其他东西上只是为了让它们出现而不必对它们进行分组,只要我认为我知道你在寻找什么,这对你想要的东西不起作用=)让我知道如果我知道你的最终结果“规格”是什么,我绝对可以提供帮助。

答案 2 :(得分:1)

我会使用按日期排序的最大分区来进行子查询,以显示最后的日期价格,然后在上一级进行聚合,这是一个如何工作的示例。

示例数据

input

<强>查询

let input: AnyObject!
do {
    input = try AVCaptureDeviceInput.init(device: captureDevice)
}
catch let error as NSError {
    // error handling ...
}

// ... use input

<强>结果

pk      id  shares   date                       id  price
------- --- -------- -------------------------- --- -------
100     1   100      2016-07-08 10:40:34.707    1   50
100     2   200      2016-07-06 10:40:34.707    2   20
101     3   500      2016-07-09 10:40:34.707    3   70
101     4   150      2016-07-07 10:40:34.707    4   80
102     5   300      2016-07-10 10:40:34.707    5   40

答案 3 :(得分:1)

试试这个(不要忘记用自己的表名替换@ table1和@ table2):

SELECT Aggregated.shares
, Aggregated.date
, Aggregated.other_stuff
, T2.price
FROM (
    SELECT order_id
    , SUM(shares) as shares
    , MAX(date) as date
    , MAX(other_stuff) as other_stuff
    FROM @table1 AS T1
    GROUP BY order_id
) AS Aggregated
INNER JOIN @table1 AS T1 ON Aggregated.order_id = T1.order_id AND Aggregated.date = T1.date
INNER JOIN @table2 AS T2 ON T2.id = T1.id