Group By仅适用于某些列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Group By仅适用于某些列相关的知识,希望对你有一定的参考价值。
如何仅对选择查询中的某些顶部选定列进行分组?
我想到的一个错误但简单的答案是这段代码;
SELECT TOP 5 brand, name, delivered, count(*)
From myTB
Where type = 'jeans'
Group By brand, name
Order By Count(*) DESC
我之后的结果应该返回以下结果; (上面的代码错误并返回错误)
Brand name Delivered Count
-------------------------------------
Levis 304 Slim 9/24 44
Croccer 500 Lose 3/14 22
Croccer 400 Botcut 4/7 14
Lee Botcut 33 5/5 16
Lee Slim 44 10/7 12
在上面的结果中,即使计数没有下降,我也会将品牌一个接一个地放在一起。
我试过,最接近的是这个代码;
SELECT TOP 5 brand, name, delivered, count(*)
From myTB
Where type = 'jeans'
Group By brand, name, delivered
Order By Count(*) DESC
但是这会返回这样的数据;
Brand name Delivered Count
-------------------------------------
Levis 304 Slim 9/24 44
Croccer 500 Lose 3/14 22
Lee Botcut 33 5/5 16
Croccer 400 Botcut 4/7 14
Lee Slim 44 10/7 12
如果我尝试使用“按计数排序(*),品牌”,由于某种原因,我会按照计数值的降序来看待品牌。它只是订购品牌栏而不是品牌和数量
我也尝试在同一个表上进行左连接,这样我只需要在主表中分组,但那也不对,我提出的代码真的很混乱,所以我要把它留在这个主题之外。
答案
您似乎想要按照每个品牌的最大数量和品牌第二的顺序进行订购。
select top 5 t1.* from (
select brand, name, delivered, count(*)
from myTB
where type = 'jeans'
group by brand, name, delivered
) t1 join (
select brand, cnt
from (
select brand, cnt,
row_number() over (partition by brand order by cnt desc) rn
from (select brand, count(*) cnt from myTB group by brand, name, delivered) t1
) t1
where rn = 1
) t2 on t1.brand = t2.brand
order by t2.cnt desc, t2.brand
另一答案
试试这个
select TOP 5 t1.* from (SELECT brand, name, delivered, count(*)as 'test'
From myTB
Where type = 'jeans'
Group By brand, name,delivered
)作为t1顺序由t1.test desc
以上是关于Group By仅适用于某些列的主要内容,如果未能解决你的问题,请参考以下文章
仅休眠错误:“列必须出现在 GROUP BY 子句中或在聚合函数中使用”
我们如何在具有GROUP BY子句的查询中选择非聚合列,而GROUP BY子句在功能上不依赖于GROUP BY子句中的列?