0

我有两个视图查询:

第一种观点:

SELECT 
   t1.entity_id, t1.entity_name, 
   t2.order1, t2.order2, t2.order3, t2.order4, t3.date, t2.score
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.entity_id = t2.entity_id 
LEFT JOIN table3 t3 ON t2.code = t3.code
WHERE 
   t1.entity_id = 1

第二种观点:

SELECT 
   t1.entity_id, t1.entity_name, 
   t2.order1, t2.order2, t2.order3, t2.order4, max(t3.date) as 'date'
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.entity_id = t2.entity_id 
LEFT JOIN table3 t3 ON t2.code = t3.code
WHERE
   t1.entity_id = 1
GROUP BY 
   t1.entity_id, t1.entity_name, t2.order4, t2.order3, t2.order2, t2.order1

我遇到的问题是,当我尝试选择具有最大日期的最终分数时,会出现错误:

列“dbo.t2.score”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我坚持要获得最新日期的分数,而不使用任何总分。我已经尝试了很多方法,但我无法弄清楚获得最新日期

的分数如何在这种情况下获得分数(在相同的情况下检查 order1 到 order4 之后):

  • 当日期不同时,选择最新的分数
  • 当日期相同时,选择最高分

有可能这样做吗?

在上述条件下, 我怎样才能得到entity_idand ?score

更新

view1 的结果:

entity_id | entity_name | order1 | order2 | order3 | order4 | date       | score
================================================================================  
1         | entity 1    | aaa    | rrr    | eee    | NULL   | 2012-12-15 | 2  
1         | entity 1    | aaa    | rrr    | eee    | NULL   | 2012-11-01 | 5.3  
1         | entity 1    | bbb    | sss    | ttt    | ggg    | 2012-11-16 | 1.5  
1         | entity 1    | ccc    | sss    | xxx    | NULL   | 2012-12-15 | 2.3  

view2的结果:

entity_id | entity_name | order1 | order2 | order3 | order4 | date
========================================================================
1         | entity 1    | aaa    | rrr    | eee    | NULL   | 2012-12-15 
1         | entity 1    | bbb    | sss    | ttt    | ggg    | 2012-11-16
1         | entity 1    | ccc    | sss    | xxx    | NULL   | 2012-12-15

我想要的结果:

entity_id | entity_name | order1 | order2 | order3 | order4 | date       | score
================================================================================  
1         | entity 1    | aaa    | rrr    | eee    | NULL   | 2012-12-15 | 2  
1         | entity 1    | bbb    | sss    | ttt    | ggg    | 2012-11-16 | 1.5  
1         | entity 1    | ccc    | sss    | xxx    | NULL   | 2012-12-15 | 2.3 

我已经解决了这个问题。

4

1 回答 1

0

第一:第二次查询中选择的列有小错误(3次t2.order2)。

二、部分答案:

SELECT 
    t1.entity_id, t1.entity_name, t2.order4, t2.order3, t2.order2, t2.order1, t2.score, max(t3.date) as 'date'
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.entity_id = t2.entity_id 
LEFT JOIN table3 t3 ON t2.code = t3.code
WHERE
   t1.entity_id = 1
GROUP BY 
    t1.entity_id, t1.entity_name, t2.order4, t2.order3, t2.order2, t2.order1, t2.score

如果我理解正确,您只需要每个分数的结果,那么您只需将分数列添加到选择部分以及按部分分组。

请记住:在 SQL-Server 和 Oracle 中,如果您想在没有操作的情况下显示它(max、first、sum 等),则必须将列放在 group by 子句中。

于 2012-12-16T10:35:47.133 回答