Group By 多字段如何使用?

时间:2022-01-17 15:11:06
ID      名称    数量   类别
1 羽毛球  1 0
2 乒乓球  2 1
3 篮球  0 3
4 足球  0 5
5 排球  10 0
6 篮球  5 1
7 足球  10 0

数据表如下  我想通过 名称来分组

Select 名称 From TB Group By 名称

这样 显示 效果正确 从夫的主球 和重复的 篮球 只显示一个

但是 如还像 同时 调用出来 数量 ID 类别

Select ID,名称,数量,类别 From TB Group By 名称,ID,数量,类别

这样就没有 分组效果了 全都显示出来了

我想问问 怎么可以 即调出其他字段  有可以只按 名称来分组?

13 个解决方案

#1


group by表示,根据你所要直接选择的列,进行编组,计算列除外.
如果你的数据行中有一列值不一样,电脑就不能精确的知道,你想归为哪一组,所以这种功能还是不提供的好.

#2



Select 名称,max(ID),max(数量),min(类别) From TB Group By 名称

#3


应该是不可能的
除非你再做另外一个查询

#4


你要的结果是不是这样的

名称 类别0-数量,类别5-数量
足球 10         0

#5



Select ID,名称,数量,类别 From TB Group By 名称,ID,数量,类别

这样就没有 分组效果了 全都显示出来了



--肯定了,你看看你两个篮球的类别是不一致的,那你分组之后肯定不一样了

#6



这样就没有 分组效果了 全都显示出来了

我想问问 怎么可以 即调出其他字段 有可以只按 名称来分组?




--你每个ID是不一样的,调出其他字段 有可以只按 名称来分组?可能吗?被你搞晕了
--那你足球的ID显示4啊还是7,楼主你思路不清啊?

#7



--我猜你是想要这样效果吧

create table TestGroup
(
id int,
name varchar(10),
Amount int,
category int

)
insert into TestGroup values (1, '羽毛球',  1, 0)
insert into TestGroup values (2 ,'乒乓球' , 2, 1)
insert into TestGroup values (3 ,'篮球',  0, 3)
insert into TestGroup values (4 ,'足球'  , 0 ,5)
insert into TestGroup values (5, '排球' , 10, 0)
insert into TestGroup values (6 ,'篮球',  5, 1)
insert into TestGroup values (7 ,'足球 ', 10, 0)

Select name From TestGroup Group By name


select distinct id, name,sum(amount) over (partition by name) as  amount , category from TestGroup




#8


我想实现的是这种效果

两个表
一个表里面 记录的 是 物品名称

ID  名称 
1   蓝球
2   足球
3   乒乓球
4   羽毛球


另一个表里面 是数量 状态
状态有两种  一种是 好“0”  一种是坏 “1”

ID  产品ID   数量   状态 
1     1       1       1
2     1       5       0
3     2       5       0


做错来以后的表效果

ID  名称    好的  坏的
1   蓝球     5      1
2   足球     5      0

    
SELECT ([CpName].[Name]) AS [产品名称],([chanpin].[ID]) AS [ID], 
Sum(Case When [chanpin].[状态] = 0 Then [chanpin].[Num] Else 0 End) AS [好的产品数量], 
Sum(Case When [chanpin].[状态] = 1 Then [chanpin].[Num] Else 0 End) AS [坏的产品数量]  
FROM [chanpin] Left Outer JOIN [CpName] ON  [chanpin].[NameID] = [CpName].[ID] group by [chanpin].[ID],[ChanPin].[NameID],[CpName].[Name]

因为我的产品名称 型号规格都在一个表里面   状态数量在令一个表里面

我想 调出 产品的数量 状态 

如果  group by [chanpin].[ID],[ChanPin].[NameID],[CpName].[Name]  这样的话 调出来的信息就不是我要的效果了 而是 根据产品规格表里面列出的 产品总类全部显示出来了

ID  名称    好的  坏的
1   蓝球     5      0
2   蓝球     0      1
3   足球     5      0
4   乒乓球   0      0
5   羽毛球   0      0

  

#9


非分组列多个值变一个值,需要使用聚合函数
avg 求平均,sum 求和,max 求最大值,min 求最小值,count 求数据条数
例如 select avg(amount) as amount,名称 from 表 group by 名称

#10


不知道你是不是有个行列转换的意思?




CREATE TABLE Ball
(
ProuctId int,
Name varchar(20)

insert into Ball values (1,'篮球')
insert into Ball values (2,'足球')
insert into Ball values (3,'乒乓球')
insert into Ball values (4,'羽毛球')

Create Table BallInfo
(
Id int,
ProcutId int,
Amount int,
Status bit
)

insert into BallInfo values (1, 1 ,1 ,1)
insert into BallInfo values (2 ,1 ,5 ,0)
insert into BallInfo values (3, 2 ,5, 0)
insert into BallInfo values (4 ,2 ,1, 1)


select 
C.Name,
A.ProcutId, A.好的,B.坏的 from Ball C,
(select ProcutId,SUM(Amount)over (partition by ProcutId,Status) as 好的 from ballInfo where status='1') A ,
(select ProcutId,SUM(Amount)over (partition by ProcutId,Status) as 坏的 from BallInfo where Status='0') B
where A.ProcutId=B.ProcutId and C.ProuctId=B.ProcutId

Name ProcutId 好的 坏的
篮球 1 1 5
足球 2 1 5

#11


引用 10 楼  的回复:
不知道你是不是有个行列转换的意思?

SQL code



CREATE TABLE Ball
(
    ProuctId int,
    Name varchar(20)

insert into Ball values (1,'篮球')
insert into Ball values (2,'足球')
insert into Ball values (3,'乒乓球')
ins……




执行提示 
服务器: 消息 156,级别 15,状态 1,行 4
在关键字 'over' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,行 5
在关键字 'over' 附近有语法错误。

#12


我的 物料名称  和数量状态 是放在两个表里面的

我想以 数量表里面的 现有数 进行排序  但是调去的时候肯定要调用物料表里面的名称 规格 等一些资料

这样的话 排序  group by  就要把物料表里面需要的字段一块写在后面才能显示

但是这样的 如果有 上百种物料名称 用 group by   而数量表里面只有几条数据 哪 调用出来 每个物料名称不是都要显示一边

问题是我使用 Sum(Case When [chanpin].[状态] = 0 Then [chanpin].[Num] Else 0 End) AS [好的产品数量]

把相同种类  相同状态的 数量进行了求和 所以必须用到  分组

#13



select id, name,sum(amount) over (partition by name) as  amount , category from TestGroup

SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY amount,category),id,name,amount,category from TestGroup

这样的结果吗

3 篮球 0 3
6 篮球 5 1
5 排球 10 0
2 乒乓球 2 1
1 羽毛球 1 0
4 足球 0 5
7 足球     10 0

#1


group by表示,根据你所要直接选择的列,进行编组,计算列除外.
如果你的数据行中有一列值不一样,电脑就不能精确的知道,你想归为哪一组,所以这种功能还是不提供的好.

#2



Select 名称,max(ID),max(数量),min(类别) From TB Group By 名称

#3


应该是不可能的
除非你再做另外一个查询

#4


你要的结果是不是这样的

名称 类别0-数量,类别5-数量
足球 10         0

#5



Select ID,名称,数量,类别 From TB Group By 名称,ID,数量,类别

这样就没有 分组效果了 全都显示出来了



--肯定了,你看看你两个篮球的类别是不一致的,那你分组之后肯定不一样了

#6



这样就没有 分组效果了 全都显示出来了

我想问问 怎么可以 即调出其他字段 有可以只按 名称来分组?




--你每个ID是不一样的,调出其他字段 有可以只按 名称来分组?可能吗?被你搞晕了
--那你足球的ID显示4啊还是7,楼主你思路不清啊?

#7



--我猜你是想要这样效果吧

create table TestGroup
(
id int,
name varchar(10),
Amount int,
category int

)
insert into TestGroup values (1, '羽毛球',  1, 0)
insert into TestGroup values (2 ,'乒乓球' , 2, 1)
insert into TestGroup values (3 ,'篮球',  0, 3)
insert into TestGroup values (4 ,'足球'  , 0 ,5)
insert into TestGroup values (5, '排球' , 10, 0)
insert into TestGroup values (6 ,'篮球',  5, 1)
insert into TestGroup values (7 ,'足球 ', 10, 0)

Select name From TestGroup Group By name


select distinct id, name,sum(amount) over (partition by name) as  amount , category from TestGroup




#8


我想实现的是这种效果

两个表
一个表里面 记录的 是 物品名称

ID  名称 
1   蓝球
2   足球
3   乒乓球
4   羽毛球


另一个表里面 是数量 状态
状态有两种  一种是 好“0”  一种是坏 “1”

ID  产品ID   数量   状态 
1     1       1       1
2     1       5       0
3     2       5       0


做错来以后的表效果

ID  名称    好的  坏的
1   蓝球     5      1
2   足球     5      0

    
SELECT ([CpName].[Name]) AS [产品名称],([chanpin].[ID]) AS [ID], 
Sum(Case When [chanpin].[状态] = 0 Then [chanpin].[Num] Else 0 End) AS [好的产品数量], 
Sum(Case When [chanpin].[状态] = 1 Then [chanpin].[Num] Else 0 End) AS [坏的产品数量]  
FROM [chanpin] Left Outer JOIN [CpName] ON  [chanpin].[NameID] = [CpName].[ID] group by [chanpin].[ID],[ChanPin].[NameID],[CpName].[Name]

因为我的产品名称 型号规格都在一个表里面   状态数量在令一个表里面

我想 调出 产品的数量 状态 

如果  group by [chanpin].[ID],[ChanPin].[NameID],[CpName].[Name]  这样的话 调出来的信息就不是我要的效果了 而是 根据产品规格表里面列出的 产品总类全部显示出来了

ID  名称    好的  坏的
1   蓝球     5      0
2   蓝球     0      1
3   足球     5      0
4   乒乓球   0      0
5   羽毛球   0      0

  

#9


非分组列多个值变一个值,需要使用聚合函数
avg 求平均,sum 求和,max 求最大值,min 求最小值,count 求数据条数
例如 select avg(amount) as amount,名称 from 表 group by 名称

#10


不知道你是不是有个行列转换的意思?




CREATE TABLE Ball
(
ProuctId int,
Name varchar(20)

insert into Ball values (1,'篮球')
insert into Ball values (2,'足球')
insert into Ball values (3,'乒乓球')
insert into Ball values (4,'羽毛球')

Create Table BallInfo
(
Id int,
ProcutId int,
Amount int,
Status bit
)

insert into BallInfo values (1, 1 ,1 ,1)
insert into BallInfo values (2 ,1 ,5 ,0)
insert into BallInfo values (3, 2 ,5, 0)
insert into BallInfo values (4 ,2 ,1, 1)


select 
C.Name,
A.ProcutId, A.好的,B.坏的 from Ball C,
(select ProcutId,SUM(Amount)over (partition by ProcutId,Status) as 好的 from ballInfo where status='1') A ,
(select ProcutId,SUM(Amount)over (partition by ProcutId,Status) as 坏的 from BallInfo where Status='0') B
where A.ProcutId=B.ProcutId and C.ProuctId=B.ProcutId

Name ProcutId 好的 坏的
篮球 1 1 5
足球 2 1 5

#11


引用 10 楼  的回复:
不知道你是不是有个行列转换的意思?

SQL code



CREATE TABLE Ball
(
    ProuctId int,
    Name varchar(20)

insert into Ball values (1,'篮球')
insert into Ball values (2,'足球')
insert into Ball values (3,'乒乓球')
ins……




执行提示 
服务器: 消息 156,级别 15,状态 1,行 4
在关键字 'over' 附近有语法错误。
服务器: 消息 156,级别 15,状态 1,行 5
在关键字 'over' 附近有语法错误。

#12


我的 物料名称  和数量状态 是放在两个表里面的

我想以 数量表里面的 现有数 进行排序  但是调去的时候肯定要调用物料表里面的名称 规格 等一些资料

这样的话 排序  group by  就要把物料表里面需要的字段一块写在后面才能显示

但是这样的 如果有 上百种物料名称 用 group by   而数量表里面只有几条数据 哪 调用出来 每个物料名称不是都要显示一边

问题是我使用 Sum(Case When [chanpin].[状态] = 0 Then [chanpin].[Num] Else 0 End) AS [好的产品数量]

把相同种类  相同状态的 数量进行了求和 所以必须用到  分组

#13



select id, name,sum(amount) over (partition by name) as  amount , category from TestGroup

SELECT ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY amount,category),id,name,amount,category from TestGroup

这样的结果吗

3 篮球 0 3
6 篮球 5 1
5 排球 10 0
2 乒乓球 2 1
1 羽毛球 1 0
4 足球 0 5
7 足球     10 0