sql语句求助~~~~~~~

ws54ttl 2009-12-29 01:27:05
要求 查询 某年某期的 时候列出 该月 每天 某产品名称 采购总数 ,a收款方式销售总数,b收款方式销售总数, 本期存量 上期存量

现有 采购表 ProcTabel 包含字段 日期 ,单据ID 等

采购表明细 procdetail 包含 采购表标识 procTabelID 物品标识ID MaterialID,采购日期 Date,采购数量 CurQty,采购单价 price,等


物品表 Material 有字段 ID ,Name等

结存表 Balance 有MaterialID,期间年份字段Year和月份字段Month 本期结存数量 endcount

销售表 有销售日期Date,单据ID,如果是a销售支付方式支付的 那么销售金额录在字段 APay
如果是b销售支付方式支付的 那么销售金额录在字段 bPay

销售明细表 Saledetail 包含 销售单据ID标识 saleTabelID ,物品标识ID MaterialID,销售日期 Date,销售数量 CurQty,销售单价 price等



求SQL 语句
自己写半天 写成这个样子
select a.*,b.CurQty as Ccurqty ,c.EndQty

from
(select b.CurQty ,b.price,c.Contact,c.Manufacturers,a.Date,c.Name,c.ID

from Sale a left join Saledetail b on b.SaleID=a.ID
left join Material c on b.MaterialID =c.ID)a

full join
(select a.Date,b.Price,b.CurQty,b.Contact,c.Name,b.MaterialID
from
ProcTabel a left join procdetail b on a.ID=b.ProcTabelID
left join Material c on b.MaterialID=c.ID)b on a.ID=b.MaterialID and a.Date=b.Date
)b
left join


(SELECT g.Year, g.Period, h.Name, g.MaterialID,
g.EndQty, h.Contact,
h.Manufacturers
FROM Balance g left JOIN
Material h ON g.MaterialID = h.ID)c
on c.MaterialID=b.MaterialID and YEAR(b.date)=c.Year and MONTH(b.Date)=c.Period)



这样子只是列出明细 没有汇总 也不知道 不同的付钱方式 要如何分开 汇总 ,然后每天都有记录 如果某物品当天没有任何进出 都返回数量0请 教各位大大 这个语句 该如何写 万分感谢 加分的有。。
...全文
169 点赞 收藏 21
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dawugui 2009-12-31
这需求,实在看不明白,帮顶.
回复
gsh442464492 2009-12-31
新手上路,学习了
回复
ws54ttl 2009-12-31
记产品 进出存每天 流水账
回复
zliant 2009-12-30
很好很强大
回复
ws54ttl 2009-12-30
上面那位仁兄 。。。。 打啥广告。。。 俺的问题还没解决
回复
ws54ttl 2009-12-30
再过一天就结掉 嘿嘿
回复
q601079198 2009-12-30
08版MAPINFO地图:各县市详图+各乡镇详图 1:5000 (所有省详图合成一张,压缩仅343M)

08版全国各省份的详细地图 1:5000(除香港,澳门,台湾)

联系QQ: 601079198 淘宝地址 http://shop59583406.taobao.com/

*加QQ时请注明免费提供地图
回复
ws54ttl 2009-12-30
继续求高人给个思路。。。。
回复
ws54ttl 2009-12-29
继续 求助 。。。
回复
dawugui 2009-12-29
很长,先顶.
回复
ws54ttl 2009-12-29
-- 货品档案:Material
CREATE TABLE Material
(
ID nvarchar (8) NOT NULL,
Name nvarchar (128) NOT NULL,
)
GO
insert into Material select '1','啤酒'
insert into Material select '2','红酒'
insert into Material select '3','白酒'

采购明细:ProcTabel

CREATE TABLE ProcTabel
(
BillNO nvarchar (32) NOT NULL,
Date datetime NOT NULL,
)
GO
insert into ProcTabel select 'p1','2009-05-01'
insert into ProcTabel select 'p2','2009-05-04'
insert into ProcTabel select 'p3','2009-05-11'
----------------------------------------------------
-- 采购明细:ProcDetail
----------------------------------------------------
CREATE TABLE ProcDetail
(
ProcTabelBillNO varchar(32) NOT NULL,
MaterialID int NOT NULL,
CurQty decimal (10,4) NOT NULL,
Price decimal (20,8) NOT NULL,
Amount decimal (20,8) NOT NULL,
)
GO
insert into ProcDetail select 'p1','1','33','10','330'
insert into ProcDetail select 'p1','2','33','10','330'
insert into ProcDetail select 'p3','3','33','10','330'


----------------------------------------------------
-- 结存表: Balance
----------------------------------------------------
CREATE TABLE Balance
(
Year int NOT NULL,
Period int NOT NULL,
MatrialID nvarchar (8) NOT NULL,
EndQty decimal (28,4) NOT NULL,
)
GO
insert into Balance select '2009','5','1','20'
insert into Balance select '2009','5','2','20'
insert into Balance select '2009','5','3','20'
insert into Balance select '2009','5','4','20'
insert into Balance select '2009','6','5','20'
insert into Balance select '2009','5','5','20'
insert into Balance select '2009','2','2','20'
-- 销售单据:Sale
----------------------------------------------------
CREATE TABLE Sale
(
Date datetime NOT NULL,
BillNO nvarchar(32) NOT NULL,
CashMoney money ,---现金支付
HYkMoney money , ---会员卡支付
)
GO
insert into Sale select'2009-05-01','S1',convert (money,22.00),convert (money,0.00)
insert into Sale select'2009-05-01','S2',convert (money,0.00),convert (money,44.00)
insert into Sale select'2009-05-06','S3',convert (money,33.00),convert (money,0.00)
insert into Sale select'2009-05-11','S4',convert (money,220.00),convert (money,0.00)
insert into Sale select'2009-05-04','S5',convert (money,0.00),convert (money,55.00)
----------------------------------------------------
-- 销售单明细:Saledetail
----------------------------------------------------
CREATE TABLE Saledetail
(
SaleDetailID varchar(8) NOT NULL,
SaleBillNO varchar(32) NOT NULL,
MaterialID varchar(32) NOT NULL,
CurQty decimal (10,2) NOT NULL,
Price money NOT NULL,
)
GO
insert into Saledetail select '1','S1','1','3',convert(money,2)
insert into Saledetail select '2','S2','1','3',convert(money,2)
insert into Saledetail select '3','S3','1','3',convert(money,2)
insert into Saledetail select '4','S4','1','3',convert(money,2)
insert into Saledetail select '5','S1','2','3',convert(money,2)
insert into Saledetail select '6','S1','3','3',convert(money,2)
insert into Saledetail select '7','S2','3','3',convert(money,2)
insert into Saledetail select '8','S3','2','3',convert(money,2)
希望得到类似如下表, 统计某种东西 在某个月里每天进货了多少,通过现金卖了多少,会员卡卖了多少,这个月结存了多少 如果该月该物品某天没有变化的就返回0

日期 物品名称 采购数量 本期结存 现金销售 会员卡销售
(Date) (Matrial.Name)(ProcDetail.CurQty) (Case方式销售)
(Blance.endQ) (HYK方式销售)

2009-05-01 啤酒 10 20 3 3
2009-05-02 啤酒 0 20 0 0
2009-05-03 啤酒 0 20 0 0
。 。 。 20
。 。 。 20
。 。 。 20
2009-05-11 啤酒 0 20 3 0
。。。 啤酒 。。 20 。。 。。
2009-05-11 啤酒 0 20 0 0

这样会不会明白点?






回复
--小F-- 2009-12-29

declare @startdate datetime,@enddate datetime
set @startdate='2009-09-28'
set @enddate='2009-10-5'

select convert(varchar(10),dateadd(day,number,@startdate),120)
from
master..spt_values
where
datediff(day,dateadd(day,number,@startdate), @enddate)>=0
and number>=0
and type='p'
/*----------
2009-09-28
2009-09-29
2009-09-30
2009-10-01
2009-10-02
2009-10-03
2009-10-04
2009-10-05

(8 行受影响)*/
回复
--小F-- 2009-12-29
构造一个表 left join 
declare @startdate datetime,@enddate datetime
set @startdate='2009-09-28'
set @enddate='2009-10-5'

select convert(varchar(10),dateadd(day,number,@startdate),120)
from
master..spt_values
where
datediff(day,dateadd(day,number,@startdate), @enddate)>=0
and number>=0
and type='p'
回复
ACMAIN_CHM 2009-12-29
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

回复
--小F-- 2009-12-29
构造一个表 left join
declare @startdate datetime,@enddate datetime
set @startdate='2009-09-28'
set @enddate='2009-10-5'

select convert(varchar(10),dateadd(day,number,@startdate),120)
from
master..spt_values
where
datediff(day,dateadd(day,number,@startdate), @enddate)>=0
and number>=0
and type='p'
回复
ws54ttl 2009-12-29
意思是 如选择了5月 那么从该月 5月1日 到5月30日 的记录都要显示出来 不管 数据有没有变化
例如 date Matrial contact Pcurqty Scurqty
20090501 df 2 22 2
20090502 df 2 33 0
20090503 df 2 0 0
20090504 df 2 0 0
. df 2 . .
. . . . .
. . . . .
20090520 df 2 2 2
. . . . .
. . . . .
. . . . .
20090530 df 2 0 0
这种显示方式

回复
--小F-- 2009-12-29
[Quote=引用 4 楼 ws54ttl 的回复:]
嗯  列出选定的一个月内 每一天的情况 这个如何弄的 
[/Quote]
datepart函数??或者day函数?
group by?
回复
ws54ttl 2009-12-29
嗯 列出选定的一个月内 每一天的情况 这个如何弄的
回复
--小F-- 2009-12-29
汇总的部分应该在子查询中用sum
如果某物品当天没有任何进出 都返回数量0 用isnull(字段,0)来实现
回复
--小F-- 2009-12-29
最好给测试数据来说话 这样不知道你哪里的问题
回复
加载更多回复
相关推荐
发帖
应用实例
创建于2007-09-28

2.7w+

社区成员

MS-SQL Server 应用实例
申请成为版主
帖子事件
创建了帖子
2009-12-29 01:27
社区公告
暂无公告