请教sql?(上次的表结构错了,更正一下)谢谢大家.
/*如何生成库存明细帐和库存盘点表*/
--更改表结构
create table test --出入库表
(
id int identity(1,1), --主键
货物类别 varchar(20),
货物名称 varchar(20),
货物规格 varchar(20),
货物价格 money,
出入库日期 datetime,
数量 int,
入库单编号 varchar(20),
出库单编号 varchar(20),
退库单编号 varchar(20),
出入库状态 char(1),--1代表货物入库,0代表货物出库,2代表出库退货
领用部门 varchar(20),
领用人 varchar(20)
)
--以下是入库数据
insert into test select 'a类 ', 'a1 ', '1*2 ',1000, '2007-1-1 ',10, 'rk-1 ',null,null, '1 ',null,null
insert into test select 'a类 ', 'a1 ', '1*2 ',1500, '2007-1-1 ',15, 'rk-2 ',null,null, '1 ',null,null
insert into test select 'a类 ', 'a2 ', '1*3 ',2000, '2007-1-1 ',20, 'rk-3 ',null,null, '1 ',null,null
--以下是出库数据
insert into test select 'a类 ', 'a1 ', '1*2 ',1000, '2007-1-1 ',5,null, 'ck-1 ',null, '0 ', '部门1 ', '张三 '
insert into test select 'a类 ', 'a1 ', '1*2 ',1500, '2007-1-1 ',10,null, 'ck-2 ',null, '0 ', '部门1 ', '张三 '
insert into test select 'a类 ', 'a2 ', '1*3 ',2000, '2007-1-1 ',10,null, 'ck-3 ',null, '0 ', '部门1 ', '张三 '
--以下是出库退货数据
insert into test select 'a类 ', 'a1 ', '1*2 ',1000, '2007-1-1 ',1,null,null, 'tk-1 ', '2 ', '部门1 ', '张三 '
insert into test select 'a类 ', 'a1 ', '1*2 ',1500, '2007-1-1 ',2,null,null, 'tk-2 ', '2 ', '部门1 ', '张三 '
insert into test select 'a类 ', 'a2 ', '1*3 ',2000, '2007-1-1 ',3,null,null, 'tk-3 ', '2 ', '部门1 ', '张三 '
select * from test
drop table test
/*
要求得到以下两种格式的库存帐
1.货物出入库明细
货物类别 货物名称 货物规格 货物价格 入库单据号 入库数量 入库金额 出库单据号 出库数量 出库金额 退库单据号 退库数量 退库金额 领用部门 领用人 日期 结余数量 结余金额
a类 a1 1*2 1000 rk-1 10 10000 null 0 0 null 0 0 null null 2007-1-1 10 10000
a类 a1 1*2 1500 rk-2 15 22500 null 0 0 null 0 0 null null 2007-1-1 15 22500
a类 a2 1*3 2000 rk-3 20 40000 null 0 0 null 0 0 null null 2007-1-1 20 40000
a类 a1 1*2 1000 null 0 0 ck-1 5 5000 null 0 0 部门1 张三 2007-1-1 5 5000
a类 a1 1*2 1500 null 0 0 ck-2 10 15000 null 0 0 部门1 张三 2007-1-1 5 7500
a类 a2 1*3 2000 null 0 0 ck-3 10 20000 null 0 0 部门1 张三 2007-1-1 10 20000
a类 a1 1*2 1000 null 0 0 null 0 0 tk-1 1 1000 部门1 张三 2007-1-1 6 6000
a类 a1 1*2 1500 null 0 0 null 0 0 tk-2 2 3000 部门1 张三 2007-1-1 7 10500
a类 a2 1*3 2000 null 0 0 null 0 0 tk-3 3 6000 部门1 张三 2007-1-1 13 26000
2.货物库存盘点
货物类别 货物名称 货物规格 货物价格 库存结余数量 库存结余金额 日期
a类 a1 1*2 1000 6 6000 2007-1-1
a类 a1 1*2 1500 7 10500 2007-1-1
a类 a2 1*3 2000 13 26000 2007-1-1
*/
/*
说明:
货物出入库明细帐能够按照日期段进行查询
货物库存盘点在任何一天都能得到库存的准确数字.比如,2007-1-2这一天没有出入库记录,那么在2007-1-2进行
查询的时候,也能够得出以上报表数据
*/
[解决办法]
楼主这个类似行列转换,我这里网吧没装SQL,给个例子你参考一下
create table test (姓名 char(10),课程 char(10),成绩 int)
go
insert test values( '张三 ', '语文 ',80)
insert test values( '张三 ', '数学 ',86)
insert test values( '张三 ', '英语 ',75)
insert test values( '李四 ', '语文 ',78)
insert test values( '李四 ', '数学 ',85)
insert test values( '李四 ', '英语 ',78)
select * from test
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ',sum(case 课程 when ' ' '+课程+ ' ' ' then 成绩 end) [ '+课程+ '] '
from (select distinct 课程 from test) as a
select @sql = @sql+ ' from test group by 姓名 '
exec(@sql)
drop table test
--结果
/*
姓名 课程 成绩
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78
姓名 数学 英语 语文
李四 85 78 78
张三 86 75 80
*/
[解决办法]
首先我建议你将你的关系规范化,即达到第三范式(一般都要求达到第三范式)。在你用‘insert into test select’进行查询的时候,你的确定你已经建立的表和你要插入的数据的字段类型相同且顺序是一样的,然后在用Select语句进行多表查询,即可以得到相应的查询表!