求SQL语句,难道没人能作出来?(100)

  • 主题发起人 主题发起人 hnzqw
  • 开始时间 开始时间
H

hnzqw

Unregistered / Unconfirmed
GUEST, unregistred user!
有一表“商品进销表”字段如下:日期 单据类型 商品编号 商品名称 数量 客户2010-03-2 进货 A001 钢笔 1 晨光文具厂2010-03-20 销售 A001 钢笔 -1 零售客户2010-04-01 进货 A001 钢笔 5 华星文具厂2010-05-01 进货 A002 文具盒 5 晨光文具厂2010-05-02 销售 A002 文具盒 -2 零售客户求SQL语言实现以下查询结果(可以在企业管理器中保存为视图的)商品编号 商品名称 最后进货日期 最后进货日至今天数 最后销售日期 最后销售日至少今天数 最后进货日至今销售数A001 钢笔 2010-04-01 75 2010-03-20 85 0A002 文具盒 2010-05-01 45 2010-05-02 44 2
 
你的问题出现逻辑错误,表的结构和表的记录出现交错,这是不可能的用一两个语句实现的,不过非要实现,可以用临时表实现,但这种方法是存在逻辑错误的
 
这是真实的表,除了最后进货日至今销售数无法取得,其它字段列,我都实现了。相信会有高手可以实现的。
 
如果只用一条查询语句不是不行,但当数据量多起来的话,则在执行查询时会较慢,我个人认为此表存在不太合格的构建问题,如若把单据类型分开构建的话可能在查询方面会更快(当然也可以用临表分开,但耗费资源!)
 
商品进销表是一个存在的表,无法改动的,想得到想要的结果,应该如何作?
 
create table tb4( prcdate [datetime] null, billtype [varchar] (20) null, prcNo [varchar] (20) null, prcName [varchar] (20) null, prcnum [int] null, prcCust [varchar] (50) null )select prcNo,prcName, (select max(tb2.prcdate) from tb4 tb2 where tb2.billtype='进货' and tb2.PrcNo = tb1.prcNo) as lastIndate, DATEDIFF(day, (select max(tb2.prcdate) from tb4 tb2 where tb2.billtype='进货' and tb2.PrcNo = tb1.prcNo) , getdate()) as lastinNum, (select max(tb3.prcdate) from tb4 tb3 where tb3.billtype='销售' and tb3.PrcNo = tb1.prcNo) as lastsaledate, DATEDIFF(day, (select max(tb3.prcdate) from tb4 tb3 where tb3.billtype='销售' and tb3.PrcNo = tb1.prcNo), getdate()) as lastnum, (select abs(isnull(sum(prcnum),0)) from tb4 tb5 where tb5.billtype='销售' and tb5.prcdate> (select max(tb2.prcdate) from tb4 tb2 where tb2.billtype='进货' and tb2.PrcNo = tb5.prcNo) and tb5.PrcNo = tb1.prcNo) as salecountfrom tb4 tb1group by prcNo,prcName
 
关注,我们的系统也有类似的报表,那个复杂啊,太影响效率了。不知道“商品进销表”有没有一个唯一字段?那样会稍好点写语句~~
 
有没有人用查询语句可以实现的,并且可以在SQL中保存为视图。
 
googledcjt写的应该可以啊,只要去掉前面的表结构的语句就可以保存在视图中了。
 
不就是一个简单的CASE语句吗?SELECT [商品编号],[商品名称], MAX(CASE WHEN [单据类型]='进货' THEN [日期] ELSE 0 END) AS [最后进货日期], MAX(CASE WHEN [单据类型]='进货' THEN DATEDIFF(Days,[日期],GetDate()) ELSE 0 END) AS [最后进货日至今天数], .. ..FROM GROUP BY 商品编号 商品名称
 
"最后进货日至今销售数"要用子查询.SELECT A.[商品编号],A.[商品名称], A.[最后进货日期], DATEDIFF(DAYS,A.[最后进货日期],GETDATE()) AS [最后进货日至今天数] .. SUM(CASE WHEN B.[单据类型]='销售' AND B.[日期]>A.[最后进货日期] THEN B.[数量] ELSE 0 END) AS [最后进货日至今销售数] FROM(SELECT [商品编号],[商品名称], MAX(CASE WHEN [单据类型]='进货' THEN [日期] ELSE 0 END) AS [最后进货日期], MAX(CASE WHEN [单据类型]='销售' THEN [日期] ELSE 0 END) AS [最后销售日期]FROM GROUP BY [商品编号],[商品名称]) A,表 BWHERE A.[商品编号]=B.[商品编号] AND A.[商品编号]=B.[商品名称]GROUP BY A.[商品编号],A.[商品名称]
 
还真有人有耐心来回答这个问题
 
select a.商品编号,d.商品名称,a.进货日期,b.销售日期,c.数量 from(select 商品编号,max(日期) 进货日期 from 商品进销表 where 单据类型='进货' group by 商品编号) a,(select 商品编号,max(日期) 销售日期 from 商品进销表 where 单据类型='销售' group by 商品编号) b,(select 商品编号,sum(数量) 数量 from 商品进销表 where 单据类型='销售' and 日期>=( select 进货日期 from (select 商品编号,max(日期) 进货日期 from 商品进销表 where 单据类型='进货' group by 商品编号) where 商品编号=商品进销表.商品编号 ) group by 商品编号) c,商品进销表 dwhere a.商品编号=b.商品编号 and a.商品编号=c.商品编号(+) and a.商品编号=d.商品编号
 
这个表怎么看着这么别扭。
 
后退
顶部