求一交叉表报表,高手请进,解决后立马给分!!!

kinmax 2005-08-12 07:17:45
应该是交叉报表的问题,请高手帮忙,解决后马上给分,谢谢!
票据信息表结构如下:
票据名称 char(8)
日期1 char(8)
日期2 char(8)
日期3 char(8)
日期4 char(8)
日期5 char(8)
日期6 char(8)
金額1 decimal(16,0)
金額2 decimal(16,0)
金額3 decimal(16,0)
金額4 decimal(16,0)
金額5 decimal(16,0)
金額6 decimal(16,0)

该表数据信息如下:
票据名称 SN001
日期1 2005-01
日期2 2005-02
日期3 2005-03
日期4 2005-04
日期5 2005-05
日期6 2005-06
金額1 1000
金額2 2000
金額3 3000
金額4 4000
金額5 5000
金額6 6000

要求实现如下报表:
票据名称 日期 金額
SN001 2005-01 1000
SN001 2005-02 2000
SN001 2005-03 3000
SN001 2005-04 4000
SN001 2005-05 5000
SN001 2005-06 6000

注:数据信息必须一一对应,即日期1的金额对应金额1,日期2的金额对应金额2,如此类推。同时,改表记录在一万条以上。
...全文
213 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kinmax 2005-08-15
  • 打赏
  • 举报
回复
谢谢各位的鼎立相助,经测试,楼上的方法比较可行,不过该表数据量较大,这个方法的效率可能比较低
点点星灯 2005-08-12
  • 打赏
  • 举报
回复
--结果


票据名称 日期1 日期2 日期3 日期4 日期5 日期6 金額1 金額2 金額3 金額4 金額5 金額6
-------- -------- -------- -------- -------- -------- -------- ------------------ ------------------ ------------------ ------------------ ------------------ ------------------
SN001 2005-01 2005-02 2005-03 2005-04 2005-05 2005-06 1000 2000 3000 4000 5000 6000
SN002 2005-01 2005-02 2005-03 2005-04 2005-05 2005-06 1000 2000 3000 4000 5000 6000
SN003 2005-01 2005-02 2005-03 2005-04 2005-05 2005-06 1000 2000 3000 4000 5000 6000

(所影响的行数为 3 行)

票据名称 日期 金額
-------- -------- ------------------
SN001 2005-01 1000
SN001 2005-02 2000
SN001 2005-03 3000
SN001 2005-04 4000
SN001 2005-05 5000
SN001 2005-06 6000
SN002 2005-01 1000
SN002 2005-02 2000
SN002 2005-03 3000
SN002 2005-04 4000
SN002 2005-05 5000
SN002 2005-06 6000
SN003 2005-01 1000
SN003 2005-02 2000
SN003 2005-03 3000
SN003 2005-04 4000
SN003 2005-05 5000
SN003 2005-06 6000
点点星灯 2005-08-12
  • 打赏
  • 举报
回复


declare @tab table (票据名称 char(8),
日期1 char(8),
日期2 char(8),
日期3 char(8),
日期4 char(8),
日期5 char(8),
日期6 char(8),
金額1 decimal(16,0),
金額2 decimal(16,0),
金額3 decimal(16,0),
金額4 decimal(16,0),
金額5 decimal(16,0),
金額6 decimal(16,0))

insert @tab values('SN001',
'2005-01','2005-02','2005-03','2005-04','2005-05','2005-06',
1000,2000,3000,4000,5000,6000)
insert @tab values('SN002',
'2005-01','2005-02','2005-03','2005-04','2005-05','2005-06',
1000,2000,3000,4000,5000,6000)
insert @tab values('SN003',
'2005-01','2005-02','2005-03','2005-04','2005-05','2005-06',
1000,2000,3000,4000,5000,6000)
select * from @tab

select * from (
select 票据名称,'日期'=日期1,'金額'=金額1 from @tab
union all select 票据名称,日期=日期2,金額=金額2 from @tab
union all select 票据名称,日期=日期3,金額=金額3 from @tab
union all select 票据名称,日期=日期4,金額=金額4 from @tab
union all select 票据名称,日期=日期5,金額=金額5 from @tab
union all select 票据名称,日期=日期6,金額=金額6 from @tab ) a
group by a.票据名称,a.日期,a.金額
点点星灯 2005-08-12
  • 打赏
  • 举报
回复
declare @tab table (票据名称 char(8),
日期1 char(8),
日期2 char(8),
日期3 char(8),
日期4 char(8),
日期5 char(8),
日期6 char(8),
金額1 decimal(16,0),
金額2 decimal(16,0),
金額3 decimal(16,0),
金額4 decimal(16,0),
金額5 decimal(16,0),
金額6 decimal(16,0))

insert @tab values('SN001',
'2005-01','2005-02','2005-03','2005-04','2005-05','2005-06',
1000,2000,3000,4000,5000,6000)
select * from @tab

select 票据名称,日期=日期1,金額=金額1 from @tab
union all select 票据名称,日期=日期2,金額=金額2 from @tab
union all select 票据名称,日期=日期3,金額=金額3 from @tab
union all select 票据名称,日期=日期4,金額=金額4 from @tab
union all select 票据名称,日期=日期5,金額=金額5 from @tab
union all select 票据名称,日期=日期6,金額=金額6 from @tab
vivianfdlpw 2005-08-12
  • 打赏
  • 举报
回复
create table tb
(
[票据名称] char(8),
[日期1] char(8),
[日期2] char(8),
[日期3] char(8),
[日期4] char(8),
[日期5] char(8),
[日期6] char(8),
[金額1] decimal(16,0),
[金額2] decimal(16,0),
[金額3] decimal(16,0),
[金額4] decimal(16,0),
[金額5] decimal(16,0),
[金額6] decimal(16,0)
)
insert tb
select 'SN001','2005-01','2005-02','2005-03','2005-04','2005-05','2005-06',1000,2000,3000,4000,5000,6000

--测试
declare @sql varchar(8000)
set @sql=''
select @sql=@sql+' union all select [票据名称],[日期'+num+'],[金額'+num+'] from tb'
from
(
select [num]=stuff(name,1,2,'')
from syscolumns
where id=object_id('tb')
group by stuff(name,1,2,'')
having count(1)=2
)t
order by num
set @sql=stuff(@sql,1,11,'')
--print @sql
exec(@sql)

--删除测试环境
drop table tb

--结果
/*
票据名称 日期1 金額1
-------- -------- ------------------
SN001 2005-01 1000
SN001 2005-02 2000
SN001 2005-03 3000
SN001 2005-04 4000
SN001 2005-05 5000
SN001 2005-06 6000
*/
guid6 2005-08-12
  • 打赏
  • 举报
回复
这是邹建写的一个交叉表的实例
--测试数据
CREATE TABLE #XS_REP_CLIENTPROD_CHX
(
C_PTID varchar (16) NULL ,
C_PTNAME varchar(80) NULL,
c_PCID varchar(50) NULL,
C_CUSTID varchar (15) NULL ,
c_CustName varchar (100) NULL ,
-- N_PRICE numeric(18, 2) NULL ,
-- N_PRENOINVOICE numeric(18, 3) NULL ,
N_SALEWEIGHT numeric(18, 3) NULL --,
-- N_INVOICEWEIGHT numeric(18, 3) NULL ,
-- N_NOINVOICE numeric(18, 3) NULL,
-- N_PRENOINVOICE_m numeric(18, 3) NULL,
-- N_SALEWEIGHT_m numeric(18, 3) NULL ,
-- N_INVOICEWEIGHT_m numeric(18, 3) NULL ,
-- N_NOINVOICE_m numeric(18, 3) NULL
)

insert #XS_REP_CLIENTPROD_CHX
select '001001','葡萄','0201','0201001','客户1',1
union all select '001001','葡萄','0201','0201002','客户2',2
union all select '001001','苹果','0201','0201001','客户1',3
union all select '001001','苹果','0201','0201002','客户2',4
go

--查询
declare @s varchar(8000)
set @s=''
select @s=@s+',['+C_PTNAME+']=sum(case C_PTNAME when '''
+C_PTNAME+''' then N_SALEWEIGHT else 0 end)'
from #XS_REP_CLIENTPROD_CHX
group by C_PTNAME
exec('
select c_PCID=case
when grouping(c_PCID)=1 then ''总计''
else c_PCID end
,C_CUSTID=case
when grouping(c_PCID)=1 then ''''
when grouping(C_CUSTID)=1 then ''小计''
else C_CUSTID end
,c_CustName=case
when grouping(c_CustName)=0 then c_CustName
else '''' end
'+@s+'
from #XS_REP_CLIENTPROD_CHX
group by c_PCID,C_CUSTID,c_CustName with rollup
having (grouping(c_PCID)=1 or grouping(C_CUSTID)=1)
or grouping(c_CustName)=0
')
go

--删除测试
drop table #XS_REP_CLIENTPROD_CHX

/*--测试结果

c_PCID C_CUSTID c_CustName 苹果 葡萄
---------- --------------- -------------------- ----------- ---------
0201 0201001 客户1 3.000 1.000
0201 0201002 客户2 4.000 2.000
0201 小计 7.000 3.000
总计 7.000 3.000

--*/

泡泡鱼_ 2005-08-12
  • 打赏
  • 举报
回复
select 票据名称,日期1 as 日期,金额1 as 金额 from 票据信息表
union
select 票据名称,日期2,金额1 from 票据信息表
union
select 票据名称,日期3,金额2 from 票据信息表
union
select 票据名称,日期4,金额3 from 票据信息表
union
select 票据名称,日期5,金额4 from 票据信息表
union
select 票据名称,日期6,金额5 from 票据信息表
kinmax 2005-08-12
  • 打赏
  • 举报
回复
楼上给的联结跟我的问题有出入啊,最好能根据我的表结构来讲解,感谢!
rivery 2005-08-12
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4202/4202664.xml?temp=7.609195E-02
kinmax 2005-08-12
  • 打赏
  • 举报
回复
以上模拟的是该表只有一条记录的情况,多记录时也类似操作,请高手帮助,感谢!!

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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