VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 907|回复: 5

關於select查詢的寫法

[复制链接]

1

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-1-20 15:20:01 | 显示全部楼层 |阅读模式
我有一張表:TEST(Menu_Name varchar(3), Action_Name varchar(4) )
里面的資料顯示為
Menu_Name       Action_Name
A01               新增
A01               修改
A01               刪除
A01               審核
B01               新增
B01               修改
C01               刪除
C01               審核
現在我想用SELECT查詢顯示結果為:
Menu_Name      Action_Name
   A01             新增;修改;刪除;審核
   B01             新增;修改
   C01             刪除;審核

請大家指教一二,感激不盡!
回复

使用道具 举报

0

主题

211

帖子

108.00

积分

新手上路

Rank: 1

积分
108.00
发表于 2020-1-29 12:45:02 | 显示全部楼层

create table T(Menu_Name varchar(3), Action_Name varchar(4) )
insert T select  'A01',               '新增'
union all select  'A01',               '修改'
union all select  'A01',               '刪除'
union all select  'A01',               '審核'
union all select  'B01',               '新增'
union all select  'B01',               '修改'
union all select  'C01',               '刪除'
union all select  'C01',               '審核'

create function fun(@Menu_Name char(3))
returns varchar(100)
as
begin
        declare @re varchar(1000)
        set @re=''
        select @re=@re+Action_Name+';' from T where Menu_Name=@Menu_Name
        select @re=left(@re, len(@re)-1)

        return @re
end

select distinct Menu_Name, dbo.fun(Menu_Name) as Action_Name from T

--result
Menu_Name Action_Name                                                                                          
--------- ----------------------------------------------------------------------------------------------------
A01       新增;修改;刪除;審核
B01       新增;修改
C01       刪除;審核

(3 row(s) affected)
回复

使用道具 举报

0

主题

114

帖子

69.00

积分

新手上路

Rank: 1

积分
69.00
发表于 2020-1-29 16:18:01 | 显示全部楼层
create table test(Menu_Name varchar(3), Action_Name varchar(4))
insert into test(Menu_Name , Action_Name ) values  ('A01',               '新增')
insert into test(Menu_Name , Action_Name ) values  ('A01',               '修改' )
insert into test(Menu_Name , Action_Name ) values   ('A01',               '刪除')
insert into test(Menu_Name , Action_Name ) values  ('A01',               '審核')
insert into test(Menu_Name , Action_Name )values  ('B01',               '新增')
insert into test(Menu_Name , Action_Name )values  ('B01',               '修改')
insert into test(Menu_Name , Action_Name )values  ('C01',               '刪除')
insert into test(Menu_Name , Action_Name ) values  ('C01',               '審核')
go
create function f_hb(@a varchar(10))
returns varchar(8000)
as
begin
  declare @str varchar(8000)
  set @str = ''
  select @str = @str + ';' + Action_Name from test where Menu_Name = @a
  set @str = right(@str , len(@str) - 1)
  return(@str)
End
go


select distinct Menu_Name,dbo.f_hb(Menu_Name) as Action_Name from test

drop table test
drop function f_hb
结果:
Menu_Name Action_Name        
--------- -------------------
A01       新增;修改;刪除;審核
B01       新增;修改
C01       刪除;審核

(所影响的行数为 3 行)
回复

使用道具 举报

0

主题

211

帖子

108.00

积分

新手上路

Rank: 1

积分
108.00
发表于 2020-1-29 17:18:02 | 显示全部楼层
--臨時表法

select Menu_Name, Action_Name=cast(Action_Name as varchar(100)) into #T from T order by Menu_Name

declare @Menu_Name varchar(3), @Action_Name varchar(100)
update #T set
@Action_Name=case when Menu_Name=@Menu_Name then @Action_Name+';'+Action_Name else Action_Name end,
@Menu_Name=Menu_Name,
Action_Name=@Action_Name

select Menu_Name, max(Action_Name) as Action_Name from #T group by Menu_Name

--result
Menu_Name Action_Name                                                                                          
--------- ----------------------------------------------------------------------------------------------------
A01       新增;修改;刪除;審核
B01       新增;修改
C01       刪除;審核

(3 row(s) affected)
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-29 23:00:01 | 显示全部楼层
create table T(Menu_Name varchar(3), Action_Name varchar(4) )
insert T select  'A01',               '新增'
union all select  'A01',               '修改'
union all select  'A01',               '刪除'
union all select  'A01',               '審核'
union all select  'B01',               '新增'
union all select  'B01',               '修改'
union all select  'C01',               '刪除'
union all select  'C01',               '審核'

alter table t add 显示列 varchar(20)--新增显示列
go
declare @ta table(id int identity(1,1),Menu_Name varchar(3),Action_Name varchar(4))
insert @ta
select Menu_Name,Action_Name from T
while exists(select 1 from @ta)
begin
update t
set 显示列=isnull(显示列+',','')+ta.Action_Name
from @ta ta,t
where t.Menu_Name=ta.Menu_Name and
not exists(select 1 from @ta where Menu_Name=ta.Menu_Name and id<ta.id)

delete ta
from @ta ta
where not exists(select 1 from @ta where Menu_Name=ta.Menu_Name and id<ta.id)
end
go
select distinct Menu_Name,显示列 from t--查询
go
alter table t drop column 显示列--删除
Menu_Name 显示列                  
--------- --------------------
A01       新增,修改,刪除,審核
B01       新增,修改
C01       刪除,審核

(所影响的行数为 3 行)
回复

使用道具 举报

0

主题

93

帖子

46.00

积分

新手上路

Rank: 1

积分
46.00
发表于 2020-1-30 09:00:01 | 显示全部楼层
方法比较多,用函数实现是最简单的一种,不用函数实现也很简单。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表