【发布时间】:2013-06-24 16:18:25
【问题描述】:
很遗憾,我对group by 和having 等语句的了解非常有限,因此希望您能帮助我:
我有一个观点 - 这是一段摘录 - (如果我们这里有一些欧洲人 - 它是 Winline/Mesonic 的 v021):
ID | Artikelbezeichnung1 | Bez2 | mesoyear
_____________________________________________________________________
1401MA70 | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi | 1344
1401MA70 | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi | 1356
1401MA70 | Marga ,Saracena grigio,1S,33,3/33,3 | Marazzi | 1356
1401MA71 | Marga ,Saracena beige,1S,33,3/33,3 | Marazzi | 1344
1401MA71 | Marga ,Saracena beige,1S,33,3/33,3 | Marazzi | 1356
1401MA71 | Marga ,Saracena beige,1S,33,3/33,3 | Marazzi | 1356
2401CR13 | Crista,Mahon rojo,1S,33,3/33,3 | Cristacer | 1332
2401CR13 | Crista,Mahon rojo,1S,33,3/33,3 | Cristacer | 1344
所以ID 不是唯一的,我只需要mesoyear 中 val 最高的那个。
我的第一个解决方案是:
Select
c015 as ID,
c003 as Artikelbezeichnung1,
c074 as Bez2,
mesoyear
from
CWLDATEN_91.dbo.v021
group by
c015
having
mesoyear = max(mesoyear)
但这根本不起作用......
消息 8121,第 16 级,状态 1,第 8 行
HAVING 子句中的“CWLDATEN_91.dbo.v021.mesoyear”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
所以我刚刚删除了having 声明,它变得“更好”了:
消息 8120,第 16 级,状态 1,第 2 行
列 'CWLDATEN_91.dbo.v021.c003' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。
所以我试图通过将内容添加到“分组依据”来消除错误。它奏效了。
Select
c015 as ID,
c003 as Artikelbezeichnung1,
c074 as Bez2,
max(mesoyear)
from
CWLDATEN_91.dbo.v021
group by
c015, c003, c074
给了我我想要的。
但正确的选择包含大约 24 列和一些计算。仅将所有列添加到group by...无法解决问题?
有人可以帮我找到合适的命令吗?
谢谢!
【问题讨论】:
-
既然您已经使用
ROW_NUMBER得到了答案,我将向您添加一些关于T-SQL 排名函数的链接-msdn.microsoft.com/en-us/library/ms189798.aspx 和msdn.microsoft.com/en-us/library/ms186734.aspx -
如果您只想使用
GROUP BY- 这是可能的。您可以将分组结果包装在子查询中,然后JOIN使用所有分组列将其返回到原始表。 (但我推荐 row_number)
标签: sql sql-server group-by having accounting