帮我看一下这条SQL,不能得到正确结果

footprint2008 2009-10-05 02:14:31

SELECT mysfc2.存货编码, 存货档案.存货名称 AS 存货名称,
存货档案.规格型号 AS 规格型号, 存货档案.计量单位 AS 计量单位,
SUM(mysfc1.期初数量) AS 期初数量, SUM(mysfc1.期初金额) AS 期初金额,
SUM(mysfc2.收入数量) AS 总收入数量, SUM(mysfc2.收入金额) AS 总收入金额,
SUM(mysfc2.发出数量) AS 总发出数量, SUM(mysfc2.发出金额) AS 总发出金额,
SUM(mysfc3.结存数量) AS 结存数量, SUM(mysfc3.结存金额) AS 结存金额
FROM mysfc mysfc2 LEFT OUTER JOIN
存货档案 ON 存货档案.存货编码 = mysfc2.存货编码 LEFT OUTER JOIN
mysfc mysfc1 ON 存货档案.存货编码 = mysfc1.存货编码 LEFT OUTER JOIN
mysfc mysfc3 ON 存货档案.存货编码 = mysfc3.存货编码
WHERE (mysfc2.存货编码 = 'zf003') AND (mysfc1.月 = '200908') AND (mysfc2.月 BETWEEN
'200901' AND '200904') AND (mysfc3.月 = '200909')
GROUP BY mysfc2.存货编码, 存货档案.存货名称, 存货档案.规格型号,
存货档案.计量单位
ORDER BY mysfc2.存货编码


关键是加了mysfc2.月 BETWEEN
'200901' AND '200904'
...全文
153 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
junloveyan 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 footprint2008 的回复:]
SQL codeSELECT mysfc2.存货编码, 存货档案.存货名称AS 存货名称,
存货档案.规格型号AS 规格型号, 存货档案.计量单位AS 计量单位,SUM(mysfc1.期初数量)AS 期初数量,SUM(mysfc1.期初金额)AS 期初金额,SUM(mysfc2.收入数量)AS 总收入数量,SUM(mysfc2.收入金额)AS 总收入金额,SUM(mysfc2.发出数量)AS 总发出数量,SUM(mysfc2.发出金额)AS 总发出金额,SUM(mysfc3.结存数量)AS 结存数量,SUM(mysfc3.结存金额)AS 结存金额FROM mysfc mysfc2LEFTOUTERJOIN
存货档案ON 存货档案.存货编码= mysfc2.存货编码LEFTOUTERJOIN
mysfc mysfc1ON 存货档案.存货编码= mysfc1.存货编码LEFTOUTERJOIN
mysfc mysfc3ON 存货档案.存货编码= mysfc3.存货编码WHERE (mysfc2.存货编码='zf003')AND (mysfc1.月='200908')AND (mysfc2.月BETWEEN'200901'AND'200904')AND (mysfc3.月='200909')GROUPBY mysfc2.存货编码, 存货档案.存货名称, 存货档案.规格型号,
存货档案.计量单位ORDERBY mysfc2.存货编码

关键是加了mysfc2.月 BETWEEN
      '200901' AND '200904'
[/Quote]

同意
grzx2210 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
mysfc2.月为字符类型,使用BETWEEN 时就会按照字符顺序进行查询
转化为整型查询
(cast(mysfc2.月 as int)>= 200901 and cast(mysfc2.月 as int) <=200904) AND (mysfc3.月 = '200909')

[/Quote]
定,就这个
footprint2008 2009-10-05
  • 打赏
  • 举报
回复

str="SELECT mysfc2.存货编码,存货档案.存货名称 AS 存货名称, 存货档案.规格型号 AS 规格型号, 存货档案.计量单位 AS 计量单位,mysfc1.期初数量 AS 期初数量, mysfc1.期初金额 AS 期初金额, SUM(mysfc2.收入数量) AS 收入总数量, SUM(mysfc2.收入金额) AS 收入总金额, SUM(mysfc2.发出数量) AS 发出总数量, SUM(mysfc2.发出金额) AS 发出总金额,mysfc3.结存数量 AS 结存数量, mysfc3.结存金额 AS 结存金额 FROM mysfc mysfc2 LEFT OUTER JOIN 存货档案 ON 存货档案.存货编码 = mysfc2.存货编码 LEFT OUTER JOIN mysfc mysfc1 ON 存货档案.存货编码 = mysfc1.存货编码 LEFT OUTER JOIN mysfc mysfc3 ON 存货档案.存货编码 = mysfc3.存货编码 WHERE "&getcookie()&" AND (mysfc1.月 = '"&moon&"') AND (mysfc3.月 = '"&moon2&"') AND (mysfc2.月 BETWEEN '"&moon&"' AND '"&moon2&"') GROUP BY mysfc2.存货编码, 存货档案.存货名称, 存货档案.规格型号, 存货档案.计量单位,mysfc1.期初数量, mysfc1.期初金额,mysfc3.结存数量, mysfc3.结存金额 ORDER BY mysfc2.存货编码"
footprint2008 2009-10-05
  • 打赏
  • 举报
回复
str="SELECT mysfc2.存货编码,存货档案.存货名称 AS 存货名称, 存货档案.规格型号 AS 规格型号, 存货档案.计量单位 AS 计量单位,mysfc1.期初数量 AS 期初数量, mysfc1.期初金额 AS 期初金额, SUM(mysfc2.收入数量) AS 收入总数量, SUM(mysfc2.收入金额) AS 收入总金额, SUM(mysfc2.发出数量) AS 发出总数量, SUM(mysfc2.发出金额) AS 发出总金额,mysfc3.结存数量 AS 结存数量, mysfc3.结存金额 AS 结存金额 FROM mysfc mysfc2 LEFT OUTER JOIN 存货档案 ON 存货档案.存货编码 = mysfc2.存货编码 LEFT OUTER JOIN mysfc mysfc1 ON 存货档案.存货编码 = mysfc1.存货编码 LEFT OUTER JOIN mysfc mysfc3 ON 存货档案.存货编码 = mysfc3.存货编码 WHERE "&getcookie()&" AND (mysfc1.月 = '"&moon&"') AND (mysfc3.月 = '"&moon2&"') AND (mysfc2.月 BETWEEN '"&moon&"' AND '"&moon2&"') GROUP BY mysfc2.存货编码, 存货档案.存货名称, 存货档案.规格型号, 存货档案.计量单位,mysfc1.期初数量, mysfc1.期初金额,mysfc3.结存数量, mysfc3.结存金额 ORDER BY mysfc2.存货编码"
footprint2008 2009-10-05
  • 打赏
  • 举报
回复
谢谢,我的朋友们.我自已式出来了.
str="SELECT mysfc2.存货编码,存货档案.存货名称 AS 存货名称, 存货档案.规格型号 AS 规格型号, 存货档案.计量单位 AS 计量单位,mysfc1.期初数量 AS 期初数量, mysfc1.期初金额 AS 期初金额, SUM(mysfc2.收入数量) AS 收入总数量, SUM(mysfc2.收入金额) AS 收入总金额, SUM(mysfc2.发出数量) AS 发出总数量, SUM(mysfc2.发出金额) AS 发出总金额,mysfc3.结存数量 AS 结存数量, mysfc3.结存金额 AS 结存金额 FROM mysfc mysfc2 LEFT OUTER JOIN 存货档案 ON 存货档案.存货编码 = mysfc2.存货编码 LEFT OUTER JOIN mysfc mysfc1 ON 存货档案.存货编码 = mysfc1.存货编码 LEFT OUTER JOIN mysfc mysfc3 ON 存货档案.存货编码 = mysfc3.存货编码 WHERE "&getcookie()&" AND (mysfc1.月 = '"&moon&"') AND (mysfc3.月 = '"&moon2&"') AND (mysfc2.月 BETWEEN  '"&moon&"' AND '"&moon2&"') GROUP BY mysfc2.存货编码, 存货档案.存货名称, 存货档案.规格型号, 存货档案.计量单位,mysfc1.期初数量, mysfc1.期初金额,mysfc3.结存数量, mysfc3.结存金额 ORDER BY mysfc2.存货编码"
pp373344265 2009-10-05
  • 打赏
  • 举报
回复
老子是来拿积分的
wuyq11 2009-10-05
  • 打赏
  • 举报
回复
cast(substring(mysfc2.月,5,2) as int)>=1
wuyq11 2009-10-05
  • 打赏
  • 举报
回复
不使用AND (mysfc2.月 BETWEEN '200901' AND '200904') 结果是否正确
或调截取字符串后两位转为整数cast(substring(mysfc2.月) as int)>=1,判断是否在1-4 内
vorchid 2009-10-05
  • 打赏
  • 举报
回复
可以多加点限制条件,看看取出来的结果是不是正确的,看看对特定的存货编码,取出来的记录是不是正确的,
camperer 2009-10-05
  • 打赏
  • 举报
回复
顶6楼,你可以先不加那个条件看结果对不对,如果结果对再改,先别用between,只加一个条件mysfc1.月='200908'试试,结果对了再加个条件。
数据类型,当初建表的时候应该考虑进去的。虽然sql也有类型转换,但对于人为的输入错误它也没办法的。
vorchid 2009-10-05
  • 打赏
  • 举报
回复
和类型应该没关系吧,我觉得没必要先把所有的left join起来再sum,你完全可以把条件分开sum,到最后再left到一个数据集里面,那样更清楚一点。
我瞎说的,说错了别揍我!!
footprint2008 2009-10-05
  • 打赏
  • 举报
回复
"月"的字段类型是 varchar(100)
数量和金额都是 money
其它都是varchar(200)
SQL77 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 footprint2008 的回复:]
不行,在线等啊.呵呵.
[/Quote]
你得说清楚一点呀,呵呵,你的字段类型,还有你可以先试试,不加那条件,看一下所有结果,加那条件是没问题的,
要换成AND的,WHERE 会先过滤的
footprint2008 2009-10-05
  • 打赏
  • 举报
回复
不行,在线等啊.呵呵.
SQL77 2009-10-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
mysfc2.月为字符类型,使用BETWEEN 时就会按照字符顺序进行查询
转化为整型查询
(cast(mysfc2.月 as int)>= 200901 and cast(mysfc2.月 as int) <=200904) AND (mysfc3.月 = '200909')

[/Quote]
呵呵,如果他的mysfc2.月也是字符型的话,那应该没关系,
SQL77 2009-10-05
  • 打赏
  • 举报
回复
AND (mysfc2.存货编码 = 'zf003') AND (mysfc1.月 = '200908') AND (mysfc2.月 BETWEEN
'200901' AND '200904') AND (mysfc3.月 = '200909')
这样试试
footprint2008 2009-10-05
  • 打赏
  • 举报
回复
让楼上的方法还是不行.主要是期初数量与期初金额不准.因为期初只想要200908(2009年8月)的数.
而总收入数量和总发出数量是求'200901'(2009年1月) 到 '200904'(2009年4月)的合计数.这样一来200908的期初佘额就不对了.
wuyq11 2009-10-05
  • 打赏
  • 举报
回复
mysfc2.月为字符类型,使用BETWEEN 时就会按照字符顺序进行查询
转化为整型查询
(cast(mysfc2.月 as int)>= 200901 and cast(mysfc2.月 as int)<=200904) AND (mysfc3.月 = '200909')

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧