刚才贴子比较乱,我重开帖子,统一结(求SQL语句)

yorkness 2010-04-19 03:21:14
表1:
销售订单号  销售序号  发运单号  发运单序号  
D001 01 F001 01
D001 01 F002 01
D001 01 F003 01
D002 02 F001 02
D003 01 F002 02
D004 01 F002 03

上表中D001-01分成3批发货,分别是F001-01、F002-01和F003-01,也就是说,F001-01不可能存在两种订单号

表2:
箱号 发运单号 发运单序号  销售订单号  销售序号  净重
X001 F001 01      D001   01 18.56
X002 F001 01      D001   01 13.56
X003 F002 01      D001   01 28.56
X004 F002 03      D001   01 21.56
X100 F001 01      D100   01 38.56
X101 F001 01      D100   01 48.56
X102 F001 01      D101   01 23.56
X103 F100 01      D001   01 11.56
X104 F101 02      D001   01 19.56

上表中,箱号是唯一的,每条记录是明细数据

目前的情况是:在已经知道某一个订单号和订单序号的情况下,知道本订单具体的发货情况
d001-01分成几张发运单发货,而每张发运单可能发本订单的货物,同时可能调用了其他订单的货物(同样在明细中还可能存在D001-01这张订单被其他订单调货,这部分就必须去除),所以想得到本订单对应的发运单各自调用了那些货物(去除本订单被其他订单调用的货物数量)

在上面的数据条中,应该得到这个结果
销售订单号 销售序号 发运单号 发运单序号 调用销售订单号 调用销售序号 发货数量
D001 01 F001 01 D001 01 18.56+13.56 (本订单发本本订单的货)
D001 01 F002 01 D001 01 28.56    (本订单发本本订单的货)
D001 01 F001 01 D100 01 38.56+48.56 (本订单在发货时,调用了其他订单的货物)
D001 01 F001 01 D101 01 23.56 (本订单在发货时,调用了其他订单的货物)

另外,像X103和X104的箱号是本订单的货物,但是被其他订单给调走了,所以不能算在里面







...全文
221 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuxian221 2010-04-29
  • 打赏
  • 举报
回复
学习中谢谢。感谢各位大大的分享啊
yorkness 2010-04-29
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 joan_1 的回复:]
with zc as(
这段话是啥意思啊?


相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用

而且在查询分析器里,就这句话报错啊

在sql_2000 查询分析器中运行时,with zc as 这句话报错

在网上查到,这是SQL2005以上版本才有的CTE
所以在SQL2000上报错
稍做改动,就可以在SQL2000上运行了
[/Quote]
但是我要的是在程序中的一条语句啊,不是在查询分析器中的存储过程,因为在实际应用中,有许多可选参数需要参与在里面,所以只能用一条语句,其他条件我可以自己加
joan_1 2010-04-21
  • 打赏
  • 举报
回复
with zc as(
这段话是啥意思啊?


相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用

而且在查询分析器里,就这句话报错啊

在sql_2000 查询分析器中运行时,with zc as 这句话报错

在网上查到,这是SQL2005以上版本才有的CTE
所以在SQL2000上报错
稍做改动,就可以在SQL2000上运行了
yorkness 2010-04-20
  • 打赏
  • 举报
回复
再顶上去
yorkness 2010-04-19
  • 打赏
  • 举报
回复
顶上去
yorkness 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zc_0101 的回复:]
引用 18 楼 yorkness 的回复:

引用 16 楼 happycell188 的回复:
引用 13 楼 yorkness 的回复:
让爱永恒
;with zc as(
这段话是啥意思啊?


相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用

而且在查询分析器里,就这句话报错啊

你是SQL_2000?提问时请指明环境
[/Quote]

嗯,是的
zc_0101 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yorkness 的回复:]

引用 16 楼 happycell188 的回复:
引用 13 楼 yorkness 的回复:
让爱永恒
;with zc as(
这段话是啥意思啊?


相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用

而且在查询分析器里,就这句话报错啊
[/Quote]
你是SQL_2000?提问时请指明环境
yorkness 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 happycell188 的回复:]
引用 13 楼 yorkness 的回复:
让爱永恒
;with zc as(
这段话是啥意思啊?


相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用
[/Quote]
而且在查询分析器里,就这句话报错啊
yorkness 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 happycell188 的回复:]
引用 13 楼 yorkness 的回复:
让爱永恒
;with zc as(
这段话是啥意思啊?


相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用
[/Quote]

偶不是在数据库的查询过程得到,是在程序中通过一条查询语句得到想要的结果,就根据变量订单号和订单序号得到这个订单号的发货情况,所以不知道能否不通过临时表,就一条语句实现
喜-喜 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yorkness 的回复:]
让爱永恒
;with zc as(
这段话是啥意思啊?
[/Quote]

相当于创建临时表了.....只不过这个 zc 表只能被最近的一个select语句使用
yorkness 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 happycell188 的回复:]
“d001-01分成几张发运单发货,而每张发运单可能发本订单的货物,同时可能调用了其他订单的货物(同样在明细中还可能存在D001-01这张订单被其他订单调货,这部分就必须去除),所以想得到本订单对应的发运单各自调用了那些货物(去除本订单被其他订单调用的货物数量)”

在表 1 中由“销售订单号-销售序号”:D001-01 获得“发运单号、发运单序号”,由已获得的“发运单号、发运单序号”与表 2……
[/Quote]

偶不需要知道本订单被其他订单调货的情况(如果需要知道的话,就根据其他订单号来查了),我就想得到本订单调用其他订单(包括自己订单)的具体情况
喜-喜 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yorkness 的回复:]
引用 8 楼 happycell188 的回复:
引用 6 楼 yorkness 的回复:
引用 4 楼 fredrickhu 的回复:
有点长 有点晕


偶怕说不清楚


你的数据好像还是没有什么代表性!不会就是上面的吧...


偶觉得已经有代表性了呀
[/Quote]

也许还是我理解错了!!!
晚上再看吧!上课去了....
yorkness 2010-04-19
  • 打赏
  • 举报
回复
让爱永恒
;with zc as(
这段话是啥意思啊?
喜-喜 2010-04-19
  • 打赏
  • 举报
回复

“d001-01分成几张发运单发货,而每张发运单可能发本订单的货物,同时可能调用了其他订单的货物(同样在明细中还可能存在D001-01这张订单被其他订单调货,这部分就必须去除),所以想得到本订单对应的发运单各自调用了那些货物(去除本订单被其他订单调用的货物数量)”

在表 1 中由“销售订单号-销售序号”:D001-01 获得“发运单号、发运单序号”,由已获得的“发运单号、发运单序号”与表 2 进行连接就不可能出现“D001-01这张订单被其他订单调货”的情况啊。。。。。。。

yorkness 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 happycell188 的回复:]
引用 6 楼 yorkness 的回复:
引用 4 楼 fredrickhu 的回复:
有点长 有点晕


偶怕说不清楚


你的数据好像还是没有什么代表性!不会就是上面的吧...
[/Quote]

偶觉得已经有代表性了呀
dawugui 2010-04-19
  • 打赏
  • 举报
回复
晚上看看.先顶.
zc_0101 2010-04-19
  • 打赏
  • 举报
回复
--========+++++++++++++++++++++++++++++++++++==========
--======= 每天都在进步,却依然追不上地球的自传=========
--======= By: zc_0101 At:2010-04-19 15:33:39=========
--========++++++++++++++++++++++++++++++++++++=========
--> 测试数据: #a
if object_id('tempdb.dbo.#a') is not null drop table #a
create table #a (销售订单号 varchar(4),销售序号 varchar(2),发运单号 varchar(4),发运单序号 varchar(2))
insert into #a
select 'D001','01','F001','01' union all
select 'D001','01','F002','01' union all
select 'D001','01','F003','01' union all
select 'D002','02','F001','02' union all
select 'D003','01','F002','02' union all
select 'D004','01','F002','03'

--> 测试数据: #b
if object_id('tempdb.dbo.#b') is not null drop table #b
create table #b (箱号 varchar(4),发运单号 varchar(4),发运单序号 varchar(2),销售订单号 varchar(4),销售序号 varchar(2),净重 numeric(4,2))
insert into #b
select 'X001','F001','01','D001','01',18.56 union all
select 'X002','F001','01','D001','01',13.56 union all
select 'X003','F002','01','D001','01',28.56 union all
select 'X004','F002','03','D001','01',21.56 union all
select 'X100','F001','01','D100','01',38.56 union all
select 'X101','F001','01','D100','01',48.56 union all
select 'X102','F001','01','D101','01',23.56 union all
select 'X103','F100','01','D001','01',11.56 union all
select 'X104','F101','02','D001','01',19.56

----------------查询------------
declare @d_d_h varchar(50),@d_d_x_h varchar(50)
select @d_d_h='D001',@d_d_x_h='01'
;with zc as(
select a.*,b.箱号,b.净重,b.销售订单号 调用销售订单号,b.销售序号 调用销售序号 from #a a
inner join #b b on a.发运单号=b.发运单号
and a.发运单序号=b.发运单序号
where a.发运单号 in(select 发运单号 from #a where 销售订单号=@d_d_h and 销售序号=@d_d_x_h)
and a.发运单序号 in(select 发运单序号 from #a where 销售订单号=@d_d_h and 销售序号=@d_d_x_h)
)
select 销售订单号,销售序号,发运单号,发运单序号,调用销售订单号,调用销售序号,sum(净重) 总重
from zc group by 销售订单号,销售序号,发运单号,发运单序号,调用销售订单号,调用销售序号
----------------结果--------------
/*
销售订单号 销售序号 发运单号 发运单序号 调用销售订单号 调用销售序号 总重
D001 01 F001 01 D001 01 32.12
D001 01 F001 01 D100 01 87.12
D001 01 F001 01 D101 01 23.56
D001 01 F002 01 D001 01 28.56
*/
喜-喜 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yorkness 的回复:]
引用 4 楼 fredrickhu 的回复:
有点长 有点晕


偶怕说不清楚
[/Quote]

你的数据好像还是没有什么代表性!不会就是上面的吧...
喜-喜 2010-04-19
  • 打赏
  • 举报
回复
--------------------SQL Server数据格式化工具-------------------
---------------------------------------------------------------
-- DESIGNER :happycell188(喜喜)
-- QQ :584738179
-- Development Tool :Microsoft Visual C++ 6.0 C Language
-- FUNCTION :CONVERT DATA TO T-SQL
---------------------------------------------------------------
-- Microsoft SQL Server 2005
-- Developer Edition on Microsoft Windows XP [版本 5.1.2600]
---------------------------------------------------------------
---------------------------------------------------------------

use test
go
if object_id('test.dbo.tb1') is not null drop table tb1
-- 创建数据表
create table tb1
(
订单号 char(5),
订单序号 char(3),
发运单号 char(5),
发运单序号 char(3)
)
go
--插入测试数据
insert into tb1 select 'D001','01','F001','01'
union all select 'D001','01','F002','01'
union all select 'D001','01','F003','01'
union all select 'D002','02','F001','02'
union all select 'D003','01','F002','02'
union all select 'D004','01','F002','03'
go
if object_id('test.dbo.tb2') is not null drop table tb2
-- 创建数据表
create table tb2
(
箱号 char(5),
发运单号 char(5),
发运单序号 char(3),
销售订单号 char(5),
销售序号 char(3),
净重 float
)
go
--插入测试数据
insert into tb2 select 'X001','F001','01','D001','01',18.56
union all select 'X002','F001','01','D001','01',13.56
union all select 'X003','F002','01','D001','01',28.56
union all select 'X004','F002','03','D001','01',21.56
union all select 'X100','F001','01','D100','01',38.56
union all select 'X101','F001','01','D100','01',48.56
union all select 'X102','F001','01','D101','01',23.56
union all select 'X103','F100','01','D001','01',11.56
union all select 'X104','F101','02','D001','01',19.56
go
--代码实现

select tb2.销售订单号,tb2.销售序号,tb1.发运单号,tb1.发运单序号,tb2.销售订单号 调用销售订单号,tb2.销售序号 调用销售序号,sum(净重)发货数量
from tb1,tb2
where tb1.发运单号=tb2.发运单号 and tb1.发运单序号=tb2.发运单序号 and tb1.订单号 = 'D001' and tb1.订单序号 = '01'
group by tb2.销售订单号,tb2.销售序号,tb1.发运单号,tb1.发运单序号,tb2.销售订单号,tb2.销售序号

/*测试结果

销售订单号 销售序号 发运单号 发运单序号 调用销售订单号 调用销售序号 发货数量
----------------------------------------------------------------------------------------------
D001 01 F001 01 D001 01 32.12
D001 01 F002 01 D001 01 28.56
D100 01 F001 01 D100 01 87.12
D101 01 F001 01 D101 01 23.56

(4 行受影响)
*/


--select tb1.订单号,tb1.订单序号,tb1.发运单号,sum(tb2.净重)发货汇总 from tb1, tb2
--where tb1.发运单号 = tb2.发运单号 and tb1.发运单序号 = tb2.发运单序号 and tb1.订单号 = 'D001' and tb1.订单序号 = '01' and tb2.订单号 not in(
--select 订单号 from tb1 where 订单号<>'D001' and 发运单号 in (
--select 发运单号 from tb1 where 订单号 = 'D001' and 订单序号 = '01'))
--group by tb1.订单号,tb1.订单序号,tb1.发运单号

--D001 01 F001 01 D001 01 18.56+13.56 (本订单发本本订单的货)
--D001 01 F002 01 D001 01 28.56    (本订单发本本订单的货)
--D001 01 F001 01 D100 01 38.56+48.56 (本订单在发货时,调用了其他订单的货物)
--D001 01 F001 01 D101 01 23.56 (本订单在发货时,调用了其他订单的货物)
--d001-01分成几张发运单发货,而每张发运单可能发本订单的货物,同时可能调用了其他订单的货物
--(同样在明细中还可能存在D001-01这张订单被其他订单调货,这部分就必须去除),所以想得到本
--订单对应的发运单各自调用了那些货物(去除本订单被其他订单调用的货物数量)
yorkness 2010-04-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fredrickhu 的回复:]
有点长 有点晕
[/Quote]

偶怕说不清楚
加载更多回复(5)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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