求一个sql语句写法

treeway 2007-04-10 10:50:11
A表:
cardtypeid,date_time
1 2007/02/03
2 2007/03/03
3 2007/04/03
2 2007/04/03
B表:
cardtypeid, cardtypeName
1 甲
2 乙
3 丙

查询结果:

月份 甲 乙 丙 合计
2007/02 1 0 0 1
2007/03 0 1 0 1
2007/04 0 1 1 2
合计 1 2 1 4

...全文
166 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawugui 2007-04-11
  • 打赏
  • 举报
回复

if object_id('pubs..A') is not null
drop table A
go
create table A(cardtypeid int,date_time datetime)
insert into A(cardtypeid,date_time) values(1,'2007/02/03')
insert into A(cardtypeid,date_time) values(2,'2007/03/03')
insert into A(cardtypeid,date_time) values(3,'2007/04/03')
insert into A(cardtypeid,date_time) values(2,'2007/04/03')
go

if object_id('pubs..B') is not null
drop table B
go
create table B(cardtypeid int, cardtypeName varchar(10))
insert into B(cardtypeid, cardtypeName) values(1,'甲')
insert into B(cardtypeid, cardtypeName) values(2,'乙')
insert into B(cardtypeid, cardtypeName) values(3,'丙')
go

declare @sql varchar(8000)
set @sql = 'select isnull(日期,''合计'') 日期'
select @sql = @sql + ' , sum(case cardtypeName when ''' + cardtypeName + ''' then 1 else 0 end) [' + cardtypeName + ']'
from (select distinct cardtypeName from (select a.cardtypeid , convert(varchar(10),a.date_time,120) 日期 , b.cardtypeName from A,B where a.cardtypeid = b.cardtypeid) t) as m
set @sql = @sql + ' ,count(*) as 合计 from (select a.cardtypeid , convert(varchar(10),a.date_time,120) 日期 , b.cardtypeName from A,B where a.cardtypeid = b.cardtypeid) t group by 日期 with rollup'
exec(@sql)

drop table A,B

/*
日期 丙 甲 乙 合计
---------- ----------- ----------- ----------- -----------
2007-02-03 0 1 0 1
2007-03-03 0 0 1 1
2007-04-03 1 0 1 2
合计 1 1 2 4

*/
treeway 2007-04-10
  • 打赏
  • 举报
回复
谢谢你 潇洒老乌龟 :)
dawugui 2007-04-10
  • 打赏
  • 举报
回复
if object_id('pubs..A') is not null
drop table A
go
create table A(cardtypeid int,date_time datetime)
insert into A(cardtypeid,date_time) values(1,'2007/02/03')
insert into A(cardtypeid,date_time) values(2,'2007/03/03')
insert into A(cardtypeid,date_time) values(3,'2007/04/03')
insert into A(cardtypeid,date_time) values(2,'2007/04/03')
go

if object_id('pubs..B') is not null
drop table B
go
create table B(cardtypeid int, cardtypeName varchar(10))
insert into B(cardtypeid, cardtypeName) values(1,'甲')
insert into B(cardtypeid, cardtypeName) values(2,'乙')
insert into B(cardtypeid, cardtypeName) values(3,'丙')
go

declare @sql varchar(8000)
set @sql = 'select isnull(月份,''合计'') 月份'
select @sql = @sql + ' , sum(case cardtypeName when ''' + cardtypeName + ''' then 1 else 0 end) [' + cardtypeName + ']'
from (select distinct cardtypeName from (select a.cardtypeid , convert(varchar(7),a.date_time,120) 月份 , b.cardtypeName from A,B where a.cardtypeid = b.cardtypeid) t) as m
set @sql = @sql + ' ,count(*) as 合计 from (select a.cardtypeid , convert(varchar(7),a.date_time,120) 月份 , b.cardtypeName from A,B where a.cardtypeid = b.cardtypeid) t group by 月份 with rollup'
exec(@sql)

drop table A,B

/*
月份 丙 甲 乙 合计
------- ----------- ----------- ----------- -----------
2007-02 0 1 0 1
2007-03 0 0 1 1
2007-04 1 0 1 2
合计 1 1 2 4
*/
dawugui 2007-04-10
  • 打赏
  • 举报
回复
if object_id('pubs..A') is not null
drop table A
go
create table A(cardtypeid int,date_time datetime)
insert into A(cardtypeid,date_time) values(1,'2007/02/03')
insert into A(cardtypeid,date_time) values(2,'2007/03/03')
insert into A(cardtypeid,date_time) values(3,'2007/04/03')
insert into A(cardtypeid,date_time) values(2,'2007/04/03')
go

if object_id('pubs..B') is not null
drop table B
go
create table B(cardtypeid int, cardtypeName varchar(10))
insert into B(cardtypeid, cardtypeName) values(1,'甲')
insert into B(cardtypeid, cardtypeName) values(2,'乙')
insert into B(cardtypeid, cardtypeName) values(3,'丙')
go

declare @sql varchar(8000)
set @sql = 'select isnull(月份,''合计'') 月份'
select @sql = @sql + ' , sum(case cardtypeName when ''' + cardtypeName + ''' then 1 else 0 end) [' + cardtypeName + ']'
from (select distinct cardtypeName from (select a.cardtypeid , convert(varchar(7),a.date_time,120) 月份 , b.cardtypeName from A,B where a.cardtypeid = b.cardtypeid) t) as m
set @sql = @sql + ' from (select a.cardtypeid , convert(varchar(7),a.date_time,120) 月份 , b.cardtypeName from A,B where a.cardtypeid = b.cardtypeid) t group by 月份 with rollup'
exec(@sql)

drop table A,B

/*
月份 丙 甲 乙
------- ----------- ----------- -----------
2007-02 0 1 0
2007-03 0 0 1
2007-04 1 0 1
合计 1 1 2
*/
duanzhi1984 2007-04-10
  • 打赏
  • 举报
回复
使用动态语句得到上半部
再用UNION联结最后一条汇总的数据

,今天有点晚了, 明天再来吧
我要下班了

22,210

社区成员

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

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