GROUP BY 用法

发布网友 发布时间:2022-04-24 11:52

我来回答

6个回答

热心网友 时间:2022-05-05 20:21

先把最多的记录的房间取出来,再行转列

Access时,参照
http://zhidao.baidu.com/question/158219080.html
以SQL Server为例,Oracle时用静态就行了

use Tempdb
go
--> -->

if not object_id(N'Tempdb..#') is null
drop table #
Go
Create table #([楼层] nvarchar(2),[房号] int)
Insert #
select N'一楼',101 union all
select N'一楼',102 union all
select N'一楼',105 union all
select N'二楼',201 union all
select N'二楼',202 union all
select N'二楼',205
Go
DECLARE @s NVARCHAR(2000),@i NVARCHAR(2)
SET @s=''
Select TOP 1 @i=COUNT(*) from # GROUP BY 楼层 ORDER BY COUNT(*) desc
WHILE @i>0
SELECT @s=N',max(case when con='+@i+N' then [房号] end) as 房间'+@i+@s,@i=@i-1
EXEC('SELECT [楼层]'+@s+' FROM (SELECT con=(SELECT COUNT(1) FROM # WHERE 楼层=a.楼层 AND [房号]<=a.[房号]),* FROM # a)a group by [楼层]')

(6 个资料列受到影响)
楼层 房间1 房间2 房间3
---- ----------- ----------- -----------
一楼 101 102 105
二楼 201 202 205

(2 个资料列受到影响)

oracle:
SELECT [楼层],max(case when con=1 then [房号] end) as 房间1,max(case when con=2 then [房号] end) as 房间2,max(case when con=3 then [房号] end) as 房间3 FROM (SELECT con=(SELECT COUNT(1) FROM # WHERE 楼层=a.楼层 AND [房号]<=a.[房号]),* FROM # a)a group by [楼层]

热心网友 时间:2022-05-05 21:39

不一定是3个房间,但是你要有个确定数,告诉你个思路吧,新建一个临时表,
这个表中的字段是,第一个是楼层,第二个是住户,第三个同样,有几个住户建立几个字段,把你查到的数据分别插到不同的列里面去,住户一插入的第一个住户列里面去,一次类推,插入完成后数据格式应该是这样的
楼层 房号1,房号2,房号3
一楼 101
一楼 102
一楼 105
二楼 201
二楼 202
二楼 205
然后 group by 按楼层分组,就是你想要的结果 ,如果有什么疑问可以hi我

热心网友 时间:2022-05-05 23:14

很典型的行列转换的

但因为你这里没房间号的序号,所以,得用中间表过度一下才行,详细处理过程:

create table tb_low(楼层 varchar(20), 房号 int)

insert into tb_low
select '一楼', 101 union all
select '一楼', 102 union all
select '一楼', 105 union all
select '二楼', 201 union all
select '二楼', 202 union all
select '二楼', 205

select * from tb_low
楼层 房号
-------------------- -----------
一楼 101
一楼 102
一楼 105
二楼 201
二楼 202
二楼 205

(所影响的行数为 6 行)

select 楼层,房号,(select count(*) from tb_low b where b.楼层=a.楼层 and b.房号<=a.房号) as num into #temp_list from tb_low a

select * from #temp_list
楼层 房号 num
-------------------- ----------- -----------
一楼 101 1
一楼 102 2
一楼 105 3
二楼 201 1
二楼 202 2
二楼 205 3

(所影响的行数为 6 行)

declare @sql varchar(8000)
set @sql = 'select 楼层'
select @sql = @sql+', max(case [num] when '''+cast(num as varchar)+''' then 房号 else ''0'' end ) AS [房号'+cast(num as varchar)+']'
from (select distinct num from #temp_list) as a
set @sql = @sql +' from #temp_list group by 楼层 order by 房号1'
--select @sql
exec (@sql)
楼层 房号1 房号2 房号3
-------------------- ----------- ----------- -----------
一楼 101 102 105
二楼 201 202 205

ps:此过程支持"每一个楼层不一定是3个房间 "你的这个需求.

热心网友 时间:2022-05-06 01:05

行列转换的问题
declare @sql varchar(8000)
set @sql = 'select 楼层 '
select @sql = @sql + ' , max(case 房号 when ''' + 房号 + ''' then 房号 else 0 end) [' + 房号 + ']'
from (select distinct 房号 from tb) as a
set @sql = @sql + ' from tb group by 楼层'
exec(@sql)

热心网友 时间:2022-05-06 03:13

group

[groop]
(1)
名词
群,批,簇
集团,团体,小组。
divide
the
students
into
groups
of
5
(2)
动词
集合,使成一团
(with)

do
not
group
the
boys
with
the
girls.
成群,聚集,类集
(together)

in
the
wilds
animals
group
together
for
their
own
safety.
希望帮到了你,满意敬请采纳,谢谢
我是加拿大人,前海外英语老师。

热心网友 时间:2022-05-06 05:38

select
学号、姓名、科目、分数
from...group
by
科目
having
max分数
如果只是语文的就having后面再加上科目等于语文。
group
by
就是用来表示按照什么来分组,经常和having一起用表示选择条件。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com