通过sql语句直接生成报表

jieweibin 2017-11-03 03:49:44
表test数据如下:

日期 站号 销售额 销售票数 兑奖额 兑奖票数 注销额 注销票数 结算额
2017-11-01 31010001 2388 256 1760 87 34 5 594
2017-11-02 31010001 2672 240 1600 90 32 4 1040
........

说明:结算额=销售额-兑奖额-注销额

要生成如下结果:



问题的关键是 卡在 日期这行,现在是 表头有2行,请大家帮忙,谢谢!
...全文
2217 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
谢谢版主和各位兄弟,太感谢了!
唐诗三百首 2017-11-03
  • 打赏
  • 举报
回复

create table test
(日期 date,站号 varchar(20),销售额 int,销售票数 int,兑奖额 int,兑奖票数 int,注销额 int,注销票数 int,结算额 int)
  
insert into test
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040 union all
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594
  
 
declare @x date
select @x='2017-11-01'
 
declare @tsql varchar(max)
 
select @tsql='
select 站号,
       ['+convert(varchar,@x,112)+'销售额]=sum(销售额),
       ['+convert(varchar,@x,112)+'销售票数]=sum(销售票数),
       ['+convert(varchar,@x,112)+'兑奖额]=sum(兑奖额),
       ['+convert(varchar,@x,112)+'兑奖票数]=sum(兑奖票数),
       ['+convert(varchar,@x,112)+'注销额]=sum(注销额),
       ['+convert(varchar,@x,112)+'注销票数]=sum(注销票数),
       ['+convert(varchar,@x,112)+'结算金额]=sum(结算额)
 from test
 where 日期='''+convert(varchar,@x,23)+''' 
 group by 站号 '
 
exec(@tsql)

/*
站号                   20171101销售额 20171101销售票数 20171101兑奖额 20171101兑奖票数 20171101注销额 20171101注销票数 20171101结算金额
-------------------- ----------- ------------ ----------- ------------ ----------- ------------ ------------
31010001             4776        512          3520        174          68          10           1188

(1 row(s) affected)
*/
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
就是 7楼兄弟的结果上微调一下就行,不需要每天一起显示,单独显示指定某天就行
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
引用 15 楼 ap0405140 的回复:
请问"sum求和"具体是指什么? 请提供希望结果.
select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all select '2017-11-02','31010001',2672,240,1600,90,32,4,1040 union all select '2017-11-01','31010001',2388,256,1760,87,34,5,594 样例记录里2017-11-01,31010001有2条数据,需要求和并成一条结果: 31010001 4776 512 3520 174 68 10 1188
唐诗三百首 2017-11-03
  • 打赏
  • 举报
回复
请问"sum求和"具体是指什么? 请提供希望结果.
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
引用 13 楼 ap0405140 的回复:

create table test
(日期 date,站号 varchar(20),销售额 int,销售票数 int,兑奖额 int,兑奖票数 int,注销额 int,注销票数 int,结算额 int)
 
insert into test
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all                 
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040
 

declare @x date
select @x='2017-11-01'

declare @tsql varchar(max)

select @tsql='
select 站号,
       ['+convert(varchar,@x,112)+'销售额]=销售额,
       ['+convert(varchar,@x,112)+'销售票数]=销售票数,
       ['+convert(varchar,@x,112)+'兑奖额]=兑奖额,
       ['+convert(varchar,@x,112)+'兑奖票数]=兑奖票数,
       ['+convert(varchar,@x,112)+'注销额]=注销额,
       ['+convert(varchar,@x,112)+'注销票数]=注销票数,
       ['+convert(varchar,@x,112)+'结算金额]=结算额
 from test
 where 日期='''+convert(varchar,@x,23)+''' '

exec(@tsql)

/*
站号                   20171101销售额 20171101销售票数 20171101兑奖额 20171101兑奖票数 20171101注销额 20171101注销票数 20171101结算金额
-------------------- ----------- ------------ ----------- ------------ ----------- ------------ ------------
31010001             2388        256          1760        87           34          5            594

(1 row(s) affected)
*/
需要sum求和,麻烦你了,复杂的自己修改不了,谢谢!
唐诗三百首 2017-11-03
  • 打赏
  • 举报
回复

create table test
(日期 date,站号 varchar(20),销售额 int,销售票数 int,兑奖额 int,兑奖票数 int,注销额 int,注销票数 int,结算额 int)
 
insert into test
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all                 
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040
 

declare @x date
select @x='2017-11-01'

declare @tsql varchar(max)

select @tsql='
select 站号,
       ['+convert(varchar,@x,112)+'销售额]=销售额,
       ['+convert(varchar,@x,112)+'销售票数]=销售票数,
       ['+convert(varchar,@x,112)+'兑奖额]=兑奖额,
       ['+convert(varchar,@x,112)+'兑奖票数]=兑奖票数,
       ['+convert(varchar,@x,112)+'注销额]=注销额,
       ['+convert(varchar,@x,112)+'注销票数]=注销票数,
       ['+convert(varchar,@x,112)+'结算金额]=结算额
 from test
 where 日期='''+convert(varchar,@x,23)+''' '

exec(@tsql)

/*
站号                   20171101销售额 20171101销售票数 20171101兑奖额 20171101兑奖票数 20171101注销额 20171101注销票数 20171101结算金额
-------------------- ----------- ------------ ----------- ------------ ----------- ------------ ------------
31010001             2388        256          1760        87           34          5            594

(1 row(s) affected)
*/
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
sum求和也需要保留
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
引用 10 楼 ap0405140 的回复:
[quote=引用 9 楼 jieweibin 的回复:] 不好意思,需求变了,只需要单日,如20171101这一天,20171102不需要接在后面,这个需要怎样修改?辛苦了!谢谢!

create table test
(日期 date,站号 varchar(50),销售额 int,销售票数 int,兑奖额 int,兑奖票数 int,注销额 int,注销票数 int,结算额 int)

insert into test
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all                 
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040


declare @x date
select @x='2017-11-01'

select 站号,
       日销售额=销售额,
	   日销售票数=销售票数,
	   日兑奖额=兑奖额,
	   日兑奖票数=兑奖票数,
	   日注销额=注销额,
	   日注销票数=注销票数,
	   日结算金额=结算额
 from test
 where 日期=@x

/*
站号              日销售额        日销售票数       日兑奖额        日兑奖票数       日注销额        日注销票数       日结算金额
--------------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
31010001          2388        256         1760        87          34          5           594

(1 row(s) affected)
*/
[/quote] 日期还是要 拼在里面,如: 站号 20171101销售额 20171101销售票数 20171101兑奖额 20171101兑奖票数 20171101注销额 20171101注销票数 20171101日结算金额 --------------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 31010001 2388 256 1760 87 34 5
唐诗三百首 2017-11-03
  • 打赏
  • 举报
回复
引用 9 楼 jieweibin 的回复:
不好意思,需求变了,只需要单日,如20171101这一天,20171102不需要接在后面,这个需要怎样修改?辛苦了!谢谢!

create table test
(日期 date,站号 varchar(50),销售额 int,销售票数 int,兑奖额 int,兑奖票数 int,注销额 int,注销票数 int,结算额 int)

insert into test
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all                 
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040


declare @x date
select @x='2017-11-01'

select 站号,
       日销售额=销售额,
	   日销售票数=销售票数,
	   日兑奖额=兑奖额,
	   日兑奖票数=兑奖票数,
	   日注销额=注销额,
	   日注销票数=注销票数,
	   日结算金额=结算额
 from test
 where 日期=@x

/*
站号              日销售额        日销售票数       日兑奖额        日兑奖票数       日注销额        日注销票数       日结算金额
--------------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
31010001          2388        256         1760        87          34          5           594

(1 row(s) affected)
*/
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
引用 8 楼 RINK_1 的回复:


if object_id(N'tempdb..#T') is not null
drop table #T
go

create table #T
(日期 DATE,
 站号 varchar(10),
 销售额 int,
 销售票数 int,
 兑奖额 int,
 兑奖票数 int,
 注销额 int,
 注销票数 int,
 结算额 int)
 
 insert into #T
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040 union all
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594  union all
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040 union all
 select '2017-11-01','31010002',2388,256,1760,87,34,5,594  union all
 select '2017-11-02','31010002',2672,240,1600,90,32,4,1040 union all
 select '2017-11-29','31010001',2388,256,1760,87,34,5,594  union all
 select '2017-11-30','31010001',2672,240,1600,90,32,4,1040

declare @sql nvarchar(max)

select @sql=isnull(@sql+',','')+QUOTENAME(cast(日期 as varchar)+'_销售额' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_销售票数' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_兑奖额' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_兑奖票数' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_注销额' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_注销票数' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_结算额' ,'[')
from (select distinct 日期 from #T) AS A
 
set @sql='with cte1
as
(select 日期,
        站号,
        sum(销售额) as 销售额,
        SUM(销售票数) as 销售票数,
        SUM(兑奖额) as 兑奖额,
        SUM(兑奖票数) as 兑奖票数,
        sum(注销额) as 注销额,
        sum(注销票数) as 注销票数,
        sum(结算额) as 结算额
 from #T
 group by 日期,站号),
 
cte2
as
(select 站号,amount,cast(日期 as varchar)+''_''+item as item_name from cte1
unpivot (amount for item in ([销售额],[销售票数],[兑奖额],[兑奖票数],[注销额],[注销票数],[结算额])) as B)

select * from cte2 as A pivot(sum(amount) for item_name in ('+@sql+')) as B'

exec(@sql)
不好意思,需求变了,只需要单日,如20171101这一天,20171102不需要接在后面,这个需要怎样修改?辛苦了!谢谢!
RINK_1 2017-11-03
  • 打赏
  • 举报
回复


if object_id(N'tempdb..#T') is not null
drop table #T
go

create table #T
(日期 DATE,
 站号 varchar(10),
 销售额 int,
 销售票数 int,
 兑奖额 int,
 兑奖票数 int,
 注销额 int,
 注销票数 int,
 结算额 int)
 
 insert into #T
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594 union all
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040 union all
 select '2017-11-01','31010001',2388,256,1760,87,34,5,594  union all
 select '2017-11-02','31010001',2672,240,1600,90,32,4,1040 union all
 select '2017-11-01','31010002',2388,256,1760,87,34,5,594  union all
 select '2017-11-02','31010002',2672,240,1600,90,32,4,1040 union all
 select '2017-11-29','31010001',2388,256,1760,87,34,5,594  union all
 select '2017-11-30','31010001',2672,240,1600,90,32,4,1040

declare @sql nvarchar(max)

select @sql=isnull(@sql+',','')+QUOTENAME(cast(日期 as varchar)+'_销售额' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_销售票数' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_兑奖额' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_兑奖票数' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_注销额' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_注销票数' ,'[')+','+
             QUOTENAME(cast(日期 as varchar)+'_结算额' ,'[')
from (select distinct 日期 from #T) AS A
 
set @sql='with cte1
as
(select 日期,
        站号,
        sum(销售额) as 销售额,
        SUM(销售票数) as 销售票数,
        SUM(兑奖额) as 兑奖额,
        SUM(兑奖票数) as 兑奖票数,
        sum(注销额) as 注销额,
        sum(注销票数) as 注销票数,
        sum(结算额) as 结算额
 from #T
 group by 日期,站号),
 
cte2
as
(select 站号,amount,cast(日期 as varchar)+''_''+item as item_name from cte1
unpivot (amount for item in ([销售额],[销售票数],[兑奖额],[兑奖票数],[注销额],[注销票数],[结算额])) as B)

select * from cte2 as A pivot(sum(amount) for item_name in ('+@sql+')) as B'

exec(@sql)
听雨停了 2017-11-03
  • 打赏
  • 举报
回复
引用 6 楼 听雨停了的回复:
应该是可以实现的,把上一个表头作为一个空表显示,然后union下面这个结果集应该就可以实现了
当然下面这个表你需要把字段名称当内容查询显示出来然后再和上一个空表合并
听雨停了 2017-11-03
  • 打赏
  • 举报
回复
应该是可以实现的,把上一个表头作为一个空表显示,然后union下面这个结果集应该就可以实现了
日月路明 2017-11-03
  • 打赏
  • 举报
回复
这个只能编程实现,sql本身做不到,至少我不知道该怎么做
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
数据有一个月的数据,问题中只举例写了2条,实际数据类似这样的: 2017-11-01 31010001 2388 256 1760 87 34 5 594 2017-11-02 31010001 2672 240 1600 90 32 4 1040 2017-11-01 31010002 2388 256 1760 87 34 5 594 2017-11-02 31010002 2672 240 1600 90 32 4 1040 2017-11-29 31010001 2388 256 1760 87 34 5 594 2017-11-30 31010001 2672 240 1600 90 32 4 1040
jieweibin 2017-11-03
  • 打赏
  • 举报
回复
楼上二位好,如果不要表头上的日期也可以(查询结果复制到excel后再手动添加也行),或者直接把日期 & 其它列(20171101_销售额)后显示也可以,请教SQL语句怎样写?谢谢
吉普赛的歌 2017-11-03
  • 打赏
  • 举报
回复
想办法改成这样就可以了:
SELECT 20171101_销售额,
       20171101_销售票数,
       20171101_兑奖额,
       20171101_兑奖票数,
       20171101_注销额,
       20171101_注销票数,
       20171101_结算额,
       20171102_销售额,
       20171102_销售票数,
       20171102_兑奖额,
       20171102_兑奖票数,
       20171102_注销额,
       20171102_注销票数,
       20171102_结算额
FROM   t
spiritofdragon 2017-11-03
  • 打赏
  • 举报
回复
数据库查询的结果,不可能有2行表头。如果只要数据,不要表头,sql倒是能凑出来你要的数据,但表头,你还是要自己在excel里写。不够你要是在excel里做,用透视表,即可实现效果。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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