当前位置: 代码迷 >> Sql Server >> SQL 多表查询有关问题求大神指点
  详细解决方案

SQL 多表查询有关问题求大神指点

热度:40   发布时间:2016-04-24 19:42:30.0
SQL 多表查询问题求大神指点
例如有一个入库表,出库表,销售表,
入库表
ID     品名       入库数量     入库时间
1     矿泉水        100       2013-01-02
2     方便面         60       2013-01-03
3     方便面         50       2013-01-03
4     矿泉水         80       2013-01-04
5     方便面         50       2013-01-05
销售表
ID     品名       销售数量     销售时间
1     矿泉水        5         2013-01-03
2     矿泉水       10         2013-01-04
出库表

ID     品名       出库数量     出库时间
1     方便面       50         2013-01-03
2     矿泉水       80         2013-01-04


然后我要得到的信息是2013年1月五号之前的商品在库数量
 
 品名     在库数量
矿泉水      85
方便面      60    
SQL C#

------解决方案--------------------
----------------------------------------------------------------
-- Author  :DBA_Huangzj(發糞塗牆)
-- Date    :2013-11-21 07:47:38
-- Version:
--      Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
-- Dec 28 2012 20:23:12 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
--
----------------------------------------------------------------
--> 测试数据:[入库表]
if object_id('[入库表]') is not null drop table [入库表]
go 
create table [入库表]([ID] int,[品名] varchar(6),[入库数量] int,[入库时间] datetime)
insert [入库表]
select 1,'矿泉水',100,'2013-01-02' union all
select 2,'方便面',60,'2013-01-03' union all
select 3,'方便面',50,'2013-01-03' union all
select 4,'矿泉水',80,'2013-01-04' union all
select 5,'方便面',50,'2013-01-05'
--> 测试数据:[销售表]
if object_id('[销售表]') is not null drop table [销售表]
go 
create table [销售表]([ID] int,[品名] varchar(6),[销售数量] int,[销售时间] datetime)
insert [销售表]
select 1,'矿泉水',5,'2013-01-03' union all
select 2,'矿泉水',10,'2013-01-04'
--> 测试数据:[出库表]
if object_id('[出库表]') is not null drop table [出库表]
go 
create table [出库表]([ID] int,[品名] varchar(6),[出库数量] int,[出库时间] datetime)
insert [出库表]
select 1,'方便面',50,'2013-01-03' union all
select 2,'矿泉水',80,'2013-01-04'
--------------开始查询--------------------------
DECLARE @d DATETIME
SET @d='2013-01-05'--统计日期
SELECT [品名],SUM([入库数量])在库数量
FROM(
select [品名],SUM([入库数量])[入库数量] from [入库表]
WHERE [入库时间]<@d
GROUP BY [品名]
UNION ALL 
select [品名],-1*SUM([销售数量])[入库数量] from [销售表]
WHERE [销售时间] <@d
GROUP BY [品名]
UNION ALL 
select [品名],-1*SUM([出库数量])[入库数量] from [出库表]
WHERE [出库时间] <@d
GROUP BY [品名]
)a
GROUP BY [品名]
----------------结果----------------------------
/* 
品名     在库数量
------ -----------
方便面    60
矿泉水    85
*/

------解决方案--------------------
典型的进销存查库存~不过我建议你还是应该有个库存的表,要是查某一天(x)的库存,用现在库存减去x到今天的采购数量,加上x到今天的销售数量。即反着推算。
否则,随着时间的推移,你的进销数据会越来越大,还是用总采购-总销售的算法查库存,查询会越来越慢的。
------解决方案--------------------
  相关解决方案