日期:2014-05-16  浏览次数:20719 次

整一天了,没办法,只好求助各位师哥、师姐夫:求一个列出滞销商品的SQL语句
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,&n