请各位老大和zjcxc(邹建)进来看看啊!复杂查询问题?

quansui8 2004-06-09 11:31:43
原帖子在
http://community.csdn.net/Expert/topic/3022/3022143.xml?temp=.6390345



select a.wdid
,出货总数=sum(a.isum)
,正价出货数=sum(case a.tjflag when 0 then a.isum else 0 end)
,正价出货额=sum(case a.tjflag when 0 then a.isum*a.jg_zj*(1-b.kd)*(1-b.fd)*(1-b.fl) else 0 end)
,特价出货数=sum(case a.tjflag when 1 then a.isum else 0 end)
,特价出货额=sum(case a.tjflag when 1 then a.isum*a.jg_zj*(1-a.tj_kd)*(1-a.tj_fd)*(1-a.tj_fl) else 0 end)--
,销售成本合计=sum(a.isum*a.jg_cb)
from chd_cpmx a
right join chd_yywd b on a.tjflag=0 and a.wdid=b.wdid and b.xqbh=@xqbh and (b.lrsj between @Strdate and @EndDate)and (b.js_yj=1)
where (a.lrsj between @Strdate and @EndDate) and substring(a.wdid,1,4)=@xqbh
group by a.wdid

为什么在查询一段时间记录时数据×天数,错在哪里,如何改正。
...全文
282 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
quansui8 2004-07-06
  • 打赏
  • 举报
回复
up
qingzhuang 2004-06-18
  • 打赏
  • 举报
回复
up
zjcxc 2004-06-17
  • 打赏
  • 举报
回复
要看测试数据,方便测试嘛,你给结果干什么?
pjy 2004-06-17
  • 打赏
  • 举报
回复
你看一看在你上面设定的日期区间内,
select count(*)
from chd_cpmx a
where (a.lrsj between @Strdate and @EndDate) and substring(a.wdid,1,4)=@xqbh
group by a.wdid
是不是一样的!

如果不一样,那么你的结果肯定不一样!
如果是一样的,建议你调一下right join后面的几个ON条件。

zlp321002 2004-06-17
  • 打赏
  • 举报
回复
邹建老大要测试数据。楼主还没弄明白?我都晕倒。。。我都明白了。。。
quansui8 2004-06-17
  • 打赏
  • 举报
回复
以上结构,差一天的数据没有问题。但两天以上数据就不准了。
quansui8 2004-06-17
  • 打赏
  • 举报
回复
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[chd_cpmx]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[chd_cpmx]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[chd_yywd]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[chd_yywd]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[fhd_cpmx]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[fhd_cpmx]
GO

--每天初始化后,一下三个表都添加添加一条新记录,然后由人工录入出货数和返货数。
CREATE TABLE [dbo].[chd_yywd] ( --营业网点表
[wdid] [varchar] (10) NOT NULL ,
[Name] [varchar] (30) NULL ,
[Wdbh] [varchar] (6) NULL ,
[bmbh] [varchar] (3) NULL ,
[bmmc] [varchar] (30) NULL ,
[xqbh] [varchar] (5) NULL ,
[xqmc] [varchar] (30) NULL ,
[type] [varchar] (3) NULL ,
[js_rj] [bit] NULL , --日结标志
[js_yj] [bit] NULL , --月结
[yj_syrq] [varchar] (2) NULL ,
[yj_byrq] [varchar] (2) NULL ,
[js_ljse] [bit] NULL ,
[ljse_xj] [money] NULL ,
[kd] [float] NULL ,
[fd] [float] NULL ,
[fl] [float] NULL ,
[lsrw] [money] NULL ,
[hkrw] [money] NULL ,
[fpw] [money] NULL ,
[fpn] [money] NULL ,
[qt] [money] NULL ,
[ftglf] [money] NULL ,
[lsglf] [money] NULL ,
[glr_id] [varchar] (5) NULL ,
[glr_man] [varchar] (10) NULL ,
[xlbh] [varchar] (5) NULL ,
[xltype] [varchar] (10) NULL ,
[plxh] [numeric](18, 0) NULL ,
[rlbz] [bit] NULL ,
[rlll] [float] NULL ,
[rl_lx] [bit] NULL ,
[rlje] [money] NULL ,
[Address] [varchar] (30) NULL ,
[phone] [varchar] (18) NULL ,
[jsrq] [varchar] (12) NULL ,
[lrsj] [varchar] (12) NOT NULL , --录入日期
[gysID] [varchar] (20) NULL ,
[gysbm] [varchar] (10) NULL ,
[jsbz] [bit] NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[chd_cpmx] ( --出货单
[cpbh] [varchar] (18) NOT NULL ,
[Name] [varchar] (30) NULL ,
[WdID] [varchar] (12) NOT NULL ,
[type] [varchar] (3) NULL ,
[jg_cb] [money] NULL ,
[jg_zj] [money] NULL ,
[tjflag] [bit] NULL ,--特价标志
[tj_kd] [float] NULL ,
[tj_fd] [float] NULL ,
[tj_fl] [float] NULL ,
[isum] [int] NULL ,
[jsrq] [varchar] (12) NOT NULL ,
[lrsj] [varchar] (12) NOT NULL ,--录入日期
[dnbm] [varchar] (20) NULL
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[fhd_cpmx] ( --返货单
[cpbh] [varchar] (18) NOT NULL ,
[Name] [varchar] (30) NULL ,
[wdid] [varchar] (12) NOT NULL ,
[type] [varchar] (3) NULL ,
[jg_cb] [money] NULL ,
[jg_zj] [money] NULL ,
[tjflag] [bit] NULL , --特价标志
[tj_kd] [float] NULL ,
[tj_fd] [float] NULL ,
[tj_fl] [float] NULL ,
[isum] [int] NULL ,
[jsrq] [varchar] (12) NULL ,
[lrsj] [varchar] (12) NOT NULL ,--录入日期
[dnbm] [varchar] (20) NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[chd_cpmx] ADD
CONSTRAINT [PK_chd_cpmx] PRIMARY KEY CLUSTERED
(
[cpbh],
[WdID],
[lrsj]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[chd_yywd] ADD
CONSTRAINT [DF_chd_yywd_jsbz] DEFAULT (0) FOR [jsbz],
CONSTRAINT [PK_chd_yywd] PRIMARY KEY CLUSTERED
(
[wdid],
[lrsj]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[fhd_cpmx] ADD
CONSTRAINT [PK_fhd_cpmx] PRIMARY KEY CLUSTERED
(
[cpbh],
[wdid],
[lrsj]
) ON [PRIMARY]
GO

quansui8 2004-06-17
  • 打赏
  • 举报
回复
没有看自己顶一下
quansui8 2004-06-15
  • 打赏
  • 举报
回复
用过了,结果是一样的。
w_rose 2004-06-13
  • 打赏
  • 举报
回复
哦,看错了!sorry。right join正确。
w_rose 2004-06-13
  • 打赏
  • 举报
回复
太复杂,懒得看明白。

但是一眼就能看明白的是:你应该使用 inner join。
quansui8 2004-06-12
  • 打赏
  • 举报
回复
declare @StrDate varchar(15),
@EndDate varchar(15),
@Xqbh varchar(10)
set @StrDate='2004-05-17'
set @EndDate='2004-05-17'
set @Xqbh='0113'

select a.wdid
,出货总数=sum(a.isum)
,正价出货数=sum(case a.tjflag when 0 then a.isum else 0 end)
,正价出货额=sum(case a.tjflag when 0 then a.isum*a.jg_zj*(1-b.kd)*(1-b.fd)*(1-b.fl) else 0 end)
,特价出货数=sum(case a.tjflag when 1 then a.isum else 0 end)
,特价出货额=sum(case a.tjflag when 1 then a.isum*a.jg_zj*(1-a.tj_kd)*(1-a.tj_fd)*(1-a.tj_fl) else 0 end)--
,销售成本合计=sum(a.isum*a.jg_cb)
from chd_cpmx a
right join chd_yywd b on a.tjflag=0 and a.wdid=b.wdid and b.xqbh=@xqbh and (b.lrsj between @Strdate and @EndDate)and (b.js_yj=1)
where (a.lrsj between @Strdate and @EndDate) and substring(a.wdid,1,4)=@xqbh
group by a.wdid
结果为
wdid 出货总数 正价出货数 正价出货额 特价出货数 特价出货额 销售成本合计
0113047 20 20 37.600000000000001 0 0.0 .0000
0113048 24 24 46.399999999999999 0 0.0 .0000
0113049 0 0 0.0 0 0.0 .0000
0113050 37 37 72.0 0 0.0 .0000
0113051 0 0 0.0 0 0.0 .0000
0113052 22 22 43.399999999999999 0 0.0 .0000
0113053 0 0 0.0 0 0.0 .0000
0113054 30 30 60.600000000000001 0 0.0 .0000
0113055 22 22 31.0 0 0.0 .0000
0113056 10 10 14.0 0 0.0 .0000
0113057 0 0 0.0 0 0.0 .0000
0113058 0 0 0.0 0 0.0 .0000
0113059 0 0 0.0 0 0.0 .0000
0113060 0 0 0.0 0 0.0 .0000
0113061 25 25 45.600000000000001 0 0.0 .0000
0113062 0 0 0.0 0 0.0 .0000
0113063 0 0 0.0 0 0.0 .0000
0113064 0 0 0.0 0 0.0 .0000
把时间改为
set @StrDate='2004-05-16'
set @EndDate='2004-05-17'
而16日没有数量全部是零
查询结果为:
wdid 出货总数 正价出货数 正价出货额 特价出货数 特价出货额 销售成本合计
0113047 40 40 75.200000000000003 0 0.0 .0000
0113048 48 48 92.799999999999997 0 0.0 .0000
0113049 0 0 0.0 0 0.0 .0000
0113050 74 74 144.0 0 0.0 .0000
0113051 0 0 0.0 0 0.0 .0000
0113052 44 44 86.799999999999997 0 0.0 .0000
0113053 0 0 0.0 0 0.0 .0000
0113054 60 60 121.2 0 0.0 .0000
0113055 44 44 62.0 0 0.0 .0000
0113056 20 20 28.0 0 0.0 .0000
0113057 0 0 0.0 0 0.0 .0000
0113058 0 0 0.0 0 0.0 .0000
0113059 0 0 0.0 0 0.0 .0000
0113060 0 0 0.0 0 0.0 .0000
0113061 50 50 91.200000000000003 0 0.0 .0000
0113062 0 0 0.0 0 0.0 .0000
0113063 0 0 0.0 0 0.0 .0000
0113064 0 0 0.0 0 0.0 .0000

查询的结果都乘以了天数了.
quansui8 2004-06-11
  • 打赏
  • 举报
回复
(邹建) 老大在吗?谢谢了。
zjcxc 2004-06-11
  • 打赏
  • 举报
回复
帖数据出来看看.
zjcxc 2004-06-09
  • 打赏
  • 举报
回复
什么意思?
在查询一段时间记录时数据×天数
quansui8 2004-06-09
  • 打赏
  • 举报
回复
得出的正价出货额是实际的出货额的好几倍。具体的倍数就是看查询的天数了。
单独一天的数据是正确的(即@strdate=@EndDate).

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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