!!!!!!求SQL语句,行转列问题.....结贴超快,先到先得,顶者有分!

freehul 2007-04-12 03:52:56
!!!!!!求SQL语句,结贴超快,先到先得,顶者有分!


表TabA
ID EmpID RegDate ItemName RValue
------------------------------------------------------------
745 0605029 2007-03-01 基本工资 .000000
746 0605029 2007-03-01 计时工资 .000000
747 0605029 2007-03-01 计件工资 .000000
748 0605029 2007-03-01 提成工资 .000000
754 0605029 2007-03-01 通宵津贴 .000000
755 0605029 2007-03-01 住宿津贴 .000000
756 0605029 2007-03-01 交通津贴 .000000
757 0605029 2007-03-01 水电津贴 .000000
758 0605029 2007-03-01 社保津贴 .000000
759 0605029 2007-03-01 医保津贴 .000000
760 0605029 2007-03-01 补上期 .000000
761 0605029 2007-03-01 扣上期 .000000
762 0605029 2007-03-01 扣迟到 .000000
763 0605029 2007-03-01 扣早退 .000000
764 0605029 2007-03-01 扣旷工 .000000
765 0605029 2007-03-01 扣住宿费 .000000
766 0605029 2007-03-01 扣水电费 .000000
767 0605029 2007-03-01 扣社保费 .000000
768 0605029 2007-03-01 扣医保费 .000000
769 0605029 2007-03-01 扣所得税 .000000
770 0605029 2007-03-01 应发 .000000
771 0605029 2007-03-01 实发 .000000

772 0605030 2007-03-01 基本工资 .000000
773 0605030 2007-03-01 计时工资 .000000
774 0605030 2007-03-01 计件工资 .000000
775 0605030 2007-03-01 提成工资 .000000
776 0605030 2007-03-01 通宵津贴 .000000
777 0605030 2007-03-01 住宿津贴 .000000
778 0605030 2007-03-01 交通津贴 .000000
779 0605030 2007-03-01 水电津贴 .000000
780 0605030 2007-03-01 社保津贴 .000000
781 0605030 2007-03-01 医保津贴 .000000
782 0605030 2007-03-01 补上期 .000000
783 0605030 2007-03-01 扣上期 .000000
784 0605030 2007-03-01 扣迟到 .000000
785 0605030 2007-03-01 扣早退 .000000
786 0605030 2007-03-01 扣旷工 .000000
787 0605030 2007-03-01 扣住宿费 .000000
788 0605030 2007-03-01 扣水电费 .000000
789 0605030 2007-03-01 扣社保费 .000000
790 0605030 2007-03-01 扣医保费 .000000
791 0605030 2007-03-01 扣所得税 .000000
792 0605030 2007-03-01 应发 .000000
793 0605030 2007-03-01 实发 .000000

需要用SQL语句转换为下表格式
( 假设最列宽为5列,员工编号和日期在后面行不需要重复)

EmpID RegDate i1 i2 i3
----------------------------------------------------------------
0605029 2007-03-01 基本工资 计时工资 计件工资
.000000 .000000 .000000
提成工资 通宵津贴 住宿津贴
.000000 .000000 .000000
.......直到ItemName排列完成

0605030 2007-03-01 基本工资 计时工资 计件工资
.000000 .000000 .000000
提成工资 通宵津贴 住宿津贴
.000000 .000000 .000000
.......直到ItemName排列完成





...全文
400 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
freehul 2007-04-16
  • 打赏
  • 举报
回复
虽然没解决问题,还是谢谢dawugui(潇洒老乌龟) 的热心,
只好在程序里搞定了....
chairEDU 2007-04-12
  • 打赏
  • 举报
回复
sql service不支持交叉查询,在程序中很方便的
dawugui 2007-04-12
  • 打赏
  • 举报
回复
我建议你还是用程序写吧.SQL太麻烦.
freehul 2007-04-12
  • 打赏
  • 举报
回复
厉害,好长啊....谢谢
有个问题
set @mo = 3 不是控制几个项目转行吗?实际上几个项目开始转行是8,或9,或更多,这个是根据报表样式来定的,所以能不能有个控制几个项目开始转行的变量?
我列子上的项目只显示3列是为了方便表达而已..
500公里之外 2007-04-12
  • 打赏
  • 举报
回复
jf
dawugui 2007-04-12
  • 打赏
  • 举报
回复
if object_id('pubs..tb') is not null
drop table tb
go

create table tb(ID varchar(10),EmpID varchar(10),RegDate varchar(10),ItemName varchar(10),RValue decimal(18,2))
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('745', '0605029', '2007-03-01', '基本工资', 1.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('746', '0605029', '2007-03-01', '计时工资', 2.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('747', '0605029', '2007-03-01', '计件工资', 3.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('748', '0605029', '2007-03-01', '提成工资', 4.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('754', '0605029', '2007-03-01', '通宵津贴', 5.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('755', '0605029', '2007-03-01', '住宿津贴', 6.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('745', '0605030', '2007-03-01', '基本工资', 1.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('746', '0605030', '2007-03-01', '计时工资', 2.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('747', '0605030', '2007-03-01', '计件工资', 3.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('748', '0605030', '2007-03-01', '提成工资', 4.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('754', '0605030', '2007-03-01', '通宵津贴', 5.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('755', '0605030', '2007-03-01', '住宿津贴', 6.000000)
go

declare @mo as int
set @mo = 3

declare @max as int
select @max = max(px) from
(
select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a
) t


declare @sql varchar(8000)
set @sql = 'select EmpID,RegDate'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then ItemName else '''' end) [' + 'ItemName_' + cast(px as varchar) + '_' + cast(px % @mo as varchar) + ']'
+ ' , max(case px when ''' + cast(px as varchar) + ''' then rvalue else 0 end) [' + 'rvalue_' + cast(px as varchar) + '_' + cast(px % @mo as varchar) + ']'
from (select distinct px from (select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a) t) as a
set @sql = @sql + ' into tbb from (select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a) t group by EmpID,RegDate'
exec(@sql)

declare @i as int
set @i = 1
declare @j as int
set @j = 1
set @sql = 'select EmpID,RegDate,item1,item2,item0 from ('
while @i <= @max
begin
set @sql = @sql + ' select EmpID,RegDate, '
set @j = 1
while @j <= @mo
begin
set @sql = @sql + ' itemname_' + cast(@i as varchar) + '_' + cast(@j%@mo as varchar) + ' as item' + cast(@j%@mo as varchar) + ','
set @j = @j + 1
set @i = @i + 1
end
set @sql = @sql + ' xh = ' + cast(@i as varchar)
set @sql = @sql + ' from tbb union all'

set @j = 1
set @i = @i - @mo
set @sql = @sql + ' select EmpID,RegDate, '
while @j <= @mo
begin
set @sql = @sql + ' cast(rvalue_' + cast(@i as varchar) + '_' + cast(@j%@mo as varchar) + ' as varchar) as item' + cast(@j%@mo as varchar) + ','
set @j = @j + 1
set @i = @i + 1
end
set @sql = @sql + ' xh = ' + cast(@i as varchar)
set @sql = @sql + ' from tbb union all'

end

set @sql = left(@sql , len(@sql) - 9)
set @sql = @sql + ') t order by empid , regdate , xh , item1 desc '

exec(@sql)

drop table tb,tbb

/*
EmpID RegDate item1 item2 item0
---------- ---------- --------- --------- --------
0605029 2007-03-01 基本工资 计件工资 计时工资
0605029 2007-03-01 1.00 3.00 2.00
0605029 2007-03-01 提成工资 通宵津贴 住宿津贴
0605029 2007-03-01 4.00 5.00 6.00
0605030 2007-03-01 基本工资 计件工资 计时工资
0605030 2007-03-01 1.00 3.00 2.00
0605030 2007-03-01 提成工资 通宵津贴 住宿津贴
0605030 2007-03-01 4.00 5.00 6.00
*/
dawugui 2007-04-12
  • 打赏
  • 举报
回复
if object_id('pubs..tb') is not null
drop table tb
go

create table tb(ID varchar(10),EmpID varchar(10),RegDate varchar(10),ItemName varchar(10),RValue decimal(18,2))
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('745', '0605029', '2007-03-01', '基本工资', 1.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('746', '0605029', '2007-03-01', '计时工资', 2.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('747', '0605029', '2007-03-01', '计件工资', 3.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('748', '0605029', '2007-03-01', '提成工资', 4.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('754', '0605029', '2007-03-01', '通宵津贴', 5.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('755', '0605029', '2007-03-01', '住宿津贴', 6.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('745', '0605030', '2007-03-01', '基本工资', 1.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('746', '0605030', '2007-03-01', '计时工资', 2.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('747', '0605030', '2007-03-01', '计件工资', 3.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('748', '0605030', '2007-03-01', '提成工资', 4.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('754', '0605030', '2007-03-01', '通宵津贴', 5.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('755', '0605030', '2007-03-01', '住宿津贴', 6.000000)
go

declare @mo as int
set @mo = 3

declare @max as int
select @max = max(px) from
(
select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a
) t


declare @sql varchar(8000)
set @sql = 'select EmpID,RegDate'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then ItemName else '''' end) [' + 'ItemName_' + cast(px as varchar) + '_' + cast(px % @mo as varchar) + ']'
+ ' , max(case px when ''' + cast(px as varchar) + ''' then rvalue else 0 end) [' + 'rvalue_' + cast(px as varchar) + '_' + cast(px % @mo as varchar) + ']'
from (select distinct px from (select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a) t) as a
set @sql = @sql + ' into tbb from (select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a) t group by EmpID,RegDate'
exec(@sql)

declare @i as int
set @i = 1
declare @j as int
set @j = 1
set @sql = ''
while @i <= @max
begin
set @sql = @sql + ' select EmpID,RegDate, '
set @j = 1
while @j <= @mo
begin
set @sql = @sql + ' itemname_' + cast(@i as varchar) + '_' + cast(@j%@mo as varchar) + ' as item' + cast(@j%@mo as varchar) + ','
set @j = @j + 1
set @i = @i + 1
end
set @sql = @sql + ' xh = ' + cast(@i as varchar)
set @sql = @sql + ' from tbb union all'

set @j = 1
set @i = @i - @mo
set @sql = @sql + ' select EmpID,RegDate, '
while @j <= @mo
begin
set @sql = @sql + ' cast(rvalue_' + cast(@i as varchar) + '_' + cast(@j%@mo as varchar) + ' as varchar) as item' + cast(@j%@mo as varchar) + ','
set @j = @j + 1
set @i = @i + 1
end
set @sql = @sql + ' xh = ' + cast(@i as varchar)
set @sql = @sql + ' from tbb union all'

end

set @sql = left(@sql , len(@sql) - 9)
set @sql = @sql + ' order by empid , regdate , xh , item1 desc '

exec(@sql)

drop table tb,tbb

/*
EmpID RegDate item1 item2 item0 xh
---------- ---------- --------- --------- -------- -----------
0605029 2007-03-01 基本工资 计件工资 计时工资 4
0605029 2007-03-01 1.00 3.00 2.00 4
0605029 2007-03-01 提成工资 通宵津贴 住宿津贴 7
0605029 2007-03-01 4.00 5.00 6.00 7
0605030 2007-03-01 基本工资 计件工资 计时工资 4
0605030 2007-03-01 1.00 3.00 2.00 4
0605030 2007-03-01 提成工资 通宵津贴 住宿津贴 7
0605030 2007-03-01 4.00 5.00 6.00 7
*/
dawugui 2007-04-12
  • 打赏
  • 举报
回复
if object_id('pubs..tb') is not null
drop table tb
go

create table tb(ID varchar(10),EmpID varchar(10),RegDate varchar(10),ItemName varchar(10),RValue decimal(18,2))
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('745', '0605029', '2007-03-01', '基本工资', 1.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('746', '0605029', '2007-03-01', '计时工资', 2.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('747', '0605029', '2007-03-01', '计件工资', 3.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('748', '0605029', '2007-03-01', '提成工资', 4.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('754', '0605029', '2007-03-01', '通宵津贴', 5.000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('755', '0605029', '2007-03-01', '住宿津贴', 6.000000)
go

declare @mo as int
set @mo = 3

declare @max as int
select @max = max(px) from
(
select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a
) t
print @max

declare @sql varchar(8000)
set @sql = 'select EmpID,RegDate'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then ItemName else '''' end) [' + 'ItemName_' + cast(px as varchar) + '_' + cast(px % @mo as varchar) + ']'
+ ' , max(case px when ''' + cast(px as varchar) + ''' then rvalue else 0 end) [' + 'rvalue_' + cast(px as varchar) + '_' + cast(px % @mo as varchar) + ']'
from (select distinct px from (select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a) t) as a
set @sql = @sql + ' into tbb from (select px=(select count(1) from tb where EmpID=a.EmpID and RegDate = a.RegDate and ItemName<a.ItemName)+1 , * from tb a) t group by EmpID,RegDate'
exec(@sql)

declare @i as int
set @i = 1
declare @j as int
set @j = 1
set @sql = ''
while @i <= @max
begin
set @sql = @sql + ' select EmpID,RegDate, '
set @j = 1
while @j <= @mo
begin
set @sql = @sql + ' itemname_' + cast(@i as varchar) + '_' + cast(@j%@mo as varchar) + ' as item' + cast(@j%@mo as varchar) + ','
set @j = @j + 1
set @i = @i + 1
end
set @sql = left(@sql , len(@sql) - 1)
set @sql = @sql + ' from tbb union all'

set @j = 1
set @i = @i - @mo
set @sql = @sql + ' select EmpID,RegDate, '
while @j <= @mo
begin
set @sql = @sql + ' cast(rvalue_' + cast(@i as varchar) + '_' + cast(@j%@mo as varchar) + ' as varchar) as item' + cast(@j%@mo as varchar) + ','
set @j = @j + 1
set @i = @i + 1
end
set @sql = left(@sql , len(@sql) - 1)
set @sql = @sql + ' from tbb union all'

end

set @sql = left(@sql , len(@sql) - 9)

exec(@sql)

drop table tb,tbb

/*
EmpID RegDate item1 item2 item0
---------- ---------- ------------------------------ ------------------------------ ------------------------------
0605029 2007-03-01 基本工资 计件工资 计时工资
0605029 2007-03-01 1.00 3.00 2.00
0605029 2007-03-01 提成工资 通宵津贴 住宿津贴
0605029 2007-03-01 4.00 5.00 6.00

*/
freehul 2007-04-12
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5445/5445197.xml?temp=.8063928
这个有转行的列子,不过我只会用
dawugui 2007-04-12
  • 打赏
  • 举报
回复
计时工资 计件工资
.000000 .000000 .000000
提成工资 通宵津贴 住宿津贴

字段要折行,很难办到.
lin_now 2007-04-12
  • 打赏
  • 举报
回复
我慢,我先顶还不行?????????
freehul 2007-04-12
  • 打赏
  • 举报
回复
回 dawugui(潇洒老乌龟) :
ItemName的内容不是作为列名,而是作为数据显示,另外当项目数量超过表列数量的时候需要换行显示,...
dawugui 2007-04-12
  • 打赏
  • 举报
回复
OK了,其他数据自己加进去吧.
dawugui 2007-04-12
  • 打赏
  • 举报
回复
if object_id('pubs..tb') is not null
drop table tb
go

create table tb(ID varchar(10),EmpID varchar(10),RegDate varchar(10),ItemName varchar(10),RValue decimal(18,2))
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('745', '0605029', '2007-03-01', '基本工资', .000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('746', '0605029', '2007-03-01', '计时工资', .000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('747', '0605029', '2007-03-01', '计件工资', .000000)
insert into tb(ID,EmpID,RegDate,ItemName,RValue) values('748', '0605029', '2007-03-01', '提成工资', .000000)
go
declare @sql varchar(8000)
set @sql = 'select EmpID,RegDate'
select @sql = @sql + ' , sum(case ItemName when ''' + ItemName + ''' then RValue else 0 end) [' + ItemName + ']'
from (select distinct ItemName from tb) as a
set @sql = @sql + ' from tb group by EmpID,RegDate'
exec(@sql)

drop table tb

/*
EmpID RegDate 基本工资 计件工资 计时工资 提成工资
---------- ---------- ---------------------------------------- ---------------------------------------- ---------------------------------------- ----------------------------------------
0605029 2007-03-01 .00 .00 .00 .00


*/
dawugui 2007-04-12
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select EmpID,RegDate'
select @sql = @sql + ' , sum(case ItemName when ''' + ItemName + ''' then RValue else 0 end) [' + ItemName + ']'
from (select distinct RValue from tb) as a
set @sql = @sql + ' from tb group by EmpID,RegDate'
exec(@sql)
freehul 2007-04-12
  • 打赏
  • 举报
回复
晕,格式显示出来就不对了,各位将就一下
# sso-shiro-cas spring下使用shiro+cas配置单点登录,多个系统之间的访问,每次只需要登录一次 ## 系统模块说明 1. cas: 单点登录模块,这里直接拿的是cas的项目改了点样式而已 2. doc: 文档目录,里面有数据库生成语句,采用的是MySQL5.0,数据库名为db_test 3. spring-node-1: 应用1 4. spring-node-2: 应用2 其中node1跟node2都是采用spring + springMVC + mybatis 框架,使用maven做项目管理 ## cas集成说明 1.首先采用的是查数据库的方式来校验用户身份的,在cas/WEB-INF/deployerConfigContext.xml中第135行构建了这个类型 ``` xml ``` 其中QueryDatabaseAuthenticationHandler这个类是自定义构建的,在cas/WEB-INF/lib/cas-jdbc-1.0.0.jar里面,有兴趣的同学可以发编译看下,关于几个属性的说明 1. dataSource: 数据源,配置MySQL的连接信息 2. passwordEncoder: 加密方式,这里用的是MD5 3. sql: sql查询语句,这个语句就是根据用户输入的账号查询其密码 #### 以上就是单点登录管理的主要配置 ## 应用系统的配置node1 1. 应用系统采用shiro做权限控制,并且跟cas集成 2. 在/spring-node-1/src/main/resources/conf/shiro.properties 文件中 ``` properties shiro.loginUrl=http://127.0.0.1:8080/cas/login?service=http://127.0.0.1:8081/node1/shiro-cas shiro.logoutUrl=http://127.0.0.1:8080/cas/logout?service=http://127.0.0.1:8081/node1/shiro-cas shiro.cas.serverUrlPrefix=http://127.0.0.1:8080/cas shiro.cas.service=http://127.0.0.1:8081/node1/shiro-cas shiro.failureUrl=/users/loginSuccess shiro.successUrl=/users/loginSuccess ``` 其中shiro.loginUrl 跟 shiro.logoutUrl的前面是cas验证的地址,后面的是我们应用系统的地址,这样配置的方式是为了在访问我们的应用系统的时候,先到cas进行验证,如果验证成功了,cas将重定向到shiro.successUrl 所表示的地址 3.在/spring-node-1/src/main/resources/conf/shiro.xml 文件中 ``` xml /shiro-cas = casFilter /logout = logoutFilter /users/** = user ``` > 其中shiroFilter这个类主要用于需要拦截的url请,需要注意的是这个是shiro的拦截,我们还需要配置cas的过滤配置casFilter > casRealm这个类是需要我们自己实现的,主要用于shiro的权限验证,里面的属性说明如下 1. defaultRoles: 默认的角色 2. casServerUrlPrefix: cas地址 3. casService: 系统应用地址 最后我们还需要在/spring-node-1/src/main/webapp/WEB-INF/web.xml 文件中配置相关的过滤器拦截全部请 ``` xml shiroFilter org.springframework.web.filter.DelegatingFilterProxy targetFilterLifecycle true shiroFilter /* ``` ## 系统运行 1. 端口说明,cas:8080,node1:8081,node2:8082,大家可以采用maven提供的tomcat7插件,配置如下: ``` xml org.apache.tomcat.maven tomcat7-maven-plugin 2.1 8081 UTF-8 tomcat7 /node1 ``` 这样的配置,我们甚至都不需要配置tomcat服务器了,建议这种方式 2.各个模块的访问地址 > cas:http://127.0.0.1:8080/cas > node1:http://127.0.0.1:8081/node1 > node2:http://127.0.0.1:8082/node2 3.访问系统 > 输入 http://127.0.0.1:8081/node1/shiro-cas ,进入cas验证 > 输入用户名 admin,密码 admin@2015,验证成功后将会重定向到http://127.0.0.1:8081/node1//users/loginSuccess ,也就是node1系统的主页,里面的节点2代表的是node2系统的主页,你会发现我们不需要登录到node2系统就能访问其中的系统了

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧