MS-SQL数据库
有表结构如下:
1、sp:(商品目录)
spId---商品ID(主键长整型)
pm-----品名
pp-----品牌
xh-----型号
2、dList:(凭单列表)
dId----凭单号码(主键长整型)
Rq-----发生日期(字符串型,格式:2014-04-07)
YwLx---业务类型(1=采购;2=销售;3=其他)
InOut--出入库方向(1=入库;-1=出库)
3、lsz:流水账(即每个凭单的内容)
recId--顺序号(主键)
dId----凭单号码
spId---商品ID
Sl-----数量
设表中数据如下:
sp表
spId pm pp xh
1 打印机 惠普 AAA
2 传真机 松下 SS
3 收音机 德生 909
4 笔记本 戴尔 abc
dList表
dId Rq YwLx InOut
901 2014-01-01 1 1
902 2014-02-01 2 -1
903 2014-03-01 1 1
904 2014-04-01 2 -1
lsz表
recId dId spId Sl
1 901 1 5 (采购-打印机5件)
2 901 2 5 (采购-传真机5件)
3 901 3 6 (采购-收音机6件)
4 902 1 5 (售出-打印机5件)售罄
5 902 2 3 (售出-传真机3件)
7 903 3 2 (采购-传真机2件)
9 904 3 1 (售出-收音机1件)
为了描述清晰,可知余额SUM(lsz.Sl*dList.InOut)为:
打印机 0
传真机 4
收音机 5
笔记本 0
现在,目的是想列出余额>0但自2014-03-01起无任何销售记录的商品及其余额:(滞销商品)
spId pm pp xh Xcsl
2 传真机 松下 SS 4件
从2014-03-01起,虽无打印机和笔记本的销售记录,但它们余额是0,所以不需要列出
收音机有销售记录,所以也不用列出
请各位师哥、师姐夫出手相助!
------解决方案--------------------
IF EXISTS(SELECT NAME FROM sys.objects AS o WHERE NAME = 'sp')
DROP TABLE sp
GO
CREATE TABLE sp(
spid INT ,
pm NVARCHAR(10),
pp NVARCHAR(10),
xh VARCHAR(10)
)
INSERT INTO sp( spid, pm, pp, xh)
SELECT 1 , N'打印机' , N'惠普', 'AAA' union all
SELECT 2 , N'传真机' , N'松下', 'SS' union all
SELECT 3 , N'收音机' , N'德生', '909' union all
SELECT 4 , N'笔记本' , N'戴尔', 'abc'
GO
IF EXISTS(SELECT NAME FROM sys.objects AS o WHERE NAME = 'dlist')
DROP TABLE dlist
GO
CREATE TABLE dlist(did INT , rq DATE , ywlx INT , inout int
)
INSERT INTO dlist
SELECT 901 , '2014-01-01' , 1 , 1 UNION ALL
SELECT 902 , '2014-02-01' , 2 , -1 UNION ALL
SELECT 903 , '2014-03-01' , 1 , -1 UNION ALL
SELECT 904 , '2014-04-01' , 2 , -1
GO
IF EXISTS(SELECT NAME FROM sys.objects AS o WHERE NAME = 'lsz')
DROP TABLE lsz
GO
CREATE TABLE lsz(recid INT , did int , spid INT , si int
)
INSERT INTO lsz
SELECT 1 , 901 , 1, 5 UNION ALL
SELECT 2 , 901 , 2, 5 UNION ALL
SELECT 3 , 901 , 3, 6 UNION ALL
SELECT 4 , 902 , 1, 5 UNION ALL
SELECT 5 , 902 , 2, 3 UNION ALL
SELECT 7 , 903 , 3, 2 UNION ALL
SELECT 9 , 904 , 3, 1
--执行查询---------------------------
WITH a AS(
SELECT lsz.spid ,sp.pm , sp.pp ,sp.xh ,SUM(si * inout) AS xcsl , MAX(dlist.rq) AS rq FROM lsz LEFT JOIN dlist ON lsz.did = dlist.did
LEFT JOIN sp ON lsz.spid = sp.spid
GROUP BY lsz.spid , sp.pm , sp.pp , sp.xh)
SELECT * FROM a WHERE rq > '2014-03-01'
/*
* 执行结果
spid pm pp xh xcsl rq
----------- ---------- ---------- ---------- ----------- ----------
3 收音机 德生 909 3 2014-04-01
(1 row(s) affected)
*/
------解决方案--------------------
Sorry!刚看错了题意,是未异动不是有异动的,请看这边
IF EXISTS(SELECT NAME FROM sys.objects AS o WHERE NAME = 'sp')
DROP TABLE sp
GO
CREATE TABLE sp(
spid INT ,
pm NVARCHAR(10),
pp NVARCHAR(10),
xh VARCHAR(10)
)
INSERT INTO sp( spid, pm, pp, xh)
SELECT 1 , N'打印机' , N'惠普', 'AAA' union all
SELECT 2 , N'传真机' , N'松下', 'SS' union all
SELECT 3 , N'收音机' , N'德生', '909' union all