3个很简单的表合成一个,并且行转列,难,高手Come in!

wangxiaofeiwuqiao 2010-09-21 02:00:50
我是sql小菜,上面让我把3个简单的表合成1个,并且行转列, 我不知道怎么弄,请各位大哥帮帮忙。
tb1: 库存数量
包含所有的ITEM_CODE(编码),DES为名称,SNumber为库存数量,ON_HAND为状态,最多只有2种:W,Y
同一个ITEM_CODE,可能只有w状态而没有y状态,或者只有y状态而没有w状态,或者两者都有。ITEM_CODE相同状态下不会有重复。

(物料编码) (物料名称) (库存数量) (状态)
ITEM_CODE DES SNumber ON_HAND
21-00001-00010 塑胶A 500 W
21-00001-00010 塑胶A 400 Y
21-00002-00020 塑胶B 100 W
21-00002-00030 塑胶C 200 W
21-00002-00030 塑胶C 600 Y
......


tb2: PO数量
所有的物料均可在tb1中找到,即就ITEM_CODE上来说,它是tb1的子集。ITEM_CODE不会有重复。

(物料编码) (物料名称) (PO数量)
ITEM_CODE DES PONumber
21-00001-00010 塑胶A 8000
21-00002-00020 塑胶B 300
......


tb3:MO数量及需求日期
所有的物料均可在tb1中找到,即就ITEM_CODE上来说,它是tb1的子集.但是ITEM_CODE重复

(物料编码) (物料名称) (MO需求数量) (需求日期)
ITEM_CODE DES TO_BE_FLLW DATE_START
21-00001-00010 塑胶A 60 2010-09-07
21-00001-00010 塑胶A 40 2010-09-28
21-00001-00010 塑胶A 10 2010-10-14
21-00002-00030 塑胶C 50 2010-09-27
21-00002-00030 塑胶C 80 2010-09-28
21-00002-00030 塑胶C 40 2010-11-29
......


我想要的效果如下:
1。合并,将tb1中的w,y的数量分开,并且合并它的PO数量。
2。统计表tb3中未来12周的MO需求数量,以周为统计单位,当周内所有的需求总数为一个数据。
获取当日所在周为1wk,本周以前的所有总计作为0wk,下周为2wk,类推。。。每周从星期日开始(星期日没有记录,实际从星期一开始),星期六结束。假如今天是2010-09-21
说明:WIP:tb1中W状态数量,STOCK:tb1中y状态数量,PO:tb2中的PONumber
         
ITEM_CODE DES WIP STOCK PO 0wk 1wk 2wk 3wk 4wk ...... 11wk 12wk
21-00001-00010 塑胶A 500 400 8000 60 0 40 0 10 ...... 0 0
21-00002-00020 塑胶B 100 0 300 0 0 0 0 0 ...... 0 0
21-00002-00030 塑胶C 200 600 0 0 0 130 0 0 ...... 40 0

举例:塑胶C 在2wk的130是2010-09-27日的50加上2010-09-28的 80而得


我的等级现在只能给100分, 如果觉得分不够可以再开贴给分。
...全文
242 点赞 收藏 20
写回复
20 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
还有一个问题:
#mo表测试的时候

在计算1wk的时候会多加上上一周的数据,比如2010-09-13需求100,2010-09-22需求200
那么在计算1wk的时候数据应该是200,但是我数据显示是300,
其他数据经过测试均正确 。
我测试过多次了。1wk要怎么样能只计算本周的数据呢。

回复
555555555555555 2010-09-23
Create 一个View?
回复
http://topic.csdn.net/u/20100922/15/916f6ed0-fa20-4142-b1c2-14664186d4e7.html我已经解决了,Mo数量计算采用5楼的方法。
回复
dawugui 2010-09-22
[Quote=引用 14 楼 wangxiaofeiwuqiao 的回复:]
谁帮帮我啊
[/Quote]
你这堆东西,看懂都天亮了。
回复
谁帮帮我啊
回复
楼上强,明天我测试,通过就揭帖。
回复
SQLCenter 2010-09-22
--> 测试数据:#st
if object_id('tempdb.dbo.#st') is not null drop table #st
create table #st(ITEM_CODE varchar(14), DES varchar(8), SNumber int, ON_HAND varchar(8))
insert into #st
select '21-00001-00010', '塑胶A', 500, 'W' union all
select '21-00001-00010', '塑胶A', 400, 'Y' union all
select '21-00002-00020', '塑胶B', 100, 'W' union all
select '21-00002-00030', '塑胶C', 200, 'W' union all
select '21-00002-00030', '塑胶C', 600, 'Y'
--> 测试数据:#po
if object_id('tempdb.dbo.#po') is not null drop table #po
create table #po(ITEM_CODE varchar(14), DES varchar(8), PONumber int)
insert into #po
select '21-00001-00010', '塑胶A', 8000 union all
select '21-00002-00020', '塑胶B', 300
--> 测试数据:#mo
if object_id('tempdb.dbo.#mo') is not null drop table #mo
create table #mo(ITEM_CODE varchar(14), DES varchar(8), TO_BE_FLLW int, DATE_START datetime)
insert into #mo
select '21-00001-00010', '塑胶A', 60, '2010-09-07' union all
select '21-00001-00010', '塑胶A', 40, '2010-09-28' union all
select '21-00001-00010', '塑胶A', 10, '2010-10-14' union all
select '21-00002-00030', '塑胶C', 50, '2010-09-27' union all
select '21-00002-00030', '塑胶C', 80, '2010-09-28' union all
select '21-00002-00030', '塑胶C', 40, '2010-11-29'

-- 本周星期日0点
declare @ datetime
set @ = convert(varchar, (getdate() - (@@datefirst - 1 + datepart(weekday, getdate())) % 7), 112)

select a.*, PO=isnull(b.PONumber,0), [0wk]=isnull([0wk],0),
[1wk]=isnull([1wk],0), [2wk]=isnull([2wk],0), [3wk]=isnull([3wk],0),
[4wk]=isnull([4wk],0), [5wk]=isnull([5wk],0), [6wk]=isnull([6wk],0),
[7wk]=isnull([7wk],0), [8wk]=isnull([8wk],0), [9wk]=isnull([9wk],0),
[10wk]=isnull([10wk],0), [11wk]=isnull([11wk],0), [12wk]=isnull([12wk],0)
from
(
select ITEM_CODE, DES,
WIP = sum(case ON_HAND when 'W' then SNumber else 0 end),
STOCK = sum(case ON_HAND when 'Y' then SNumber else 0 end)
from #st group by ITEM_CODE, DES
) a
left join
#po b on a.ITEM_CODE = b.ITEM_CODE
left join
(
select ITEM_CODE,DES,
sum(case when DATE_START < @ then TO_BE_FLLW else 0 end) '0wk',
sum(case datediff(day,@,DATE_START)/7 when 0 then TO_BE_FLLW else 0 end) '1wk',
sum(case datediff(day,@,DATE_START)/7 when 1 then TO_BE_FLLW else 0 end) '2wk',
sum(case datediff(day,@,DATE_START)/7 when 2 then TO_BE_FLLW else 0 end) '3wk',
sum(case datediff(day,@,DATE_START)/7 when 3 then TO_BE_FLLW else 0 end) '4wk',
sum(case datediff(day,@,DATE_START)/7 when 4 then TO_BE_FLLW else 0 end) '5wk',
sum(case datediff(day,@,DATE_START)/7 when 5 then TO_BE_FLLW else 0 end) '6wk',
sum(case datediff(day,@,DATE_START)/7 when 6 then TO_BE_FLLW else 0 end) '7wk',
sum(case datediff(day,@,DATE_START)/7 when 7 then TO_BE_FLLW else 0 end) '8wk',
sum(case datediff(day,@,DATE_START)/7 when 8 then TO_BE_FLLW else 0 end) '9wk',
sum(case datediff(day,@,DATE_START)/7 when 9 then TO_BE_FLLW else 0 end) '10wk',
sum(case datediff(day,@,DATE_START)/7 when 10 then TO_BE_FLLW else 0 end) '11wk',
sum(case datediff(day,@,DATE_START)/7 when 11 then TO_BE_FLLW else 0 end) '12wk'
from #mo group by ITEM_CODE,DES
) c
on a.ITEM_CODE = c.ITEM_CODE order by 1
/*
ITEM_CODE DES WIP STOCK PO 0wk 1wk 2wk 3wk 4wk 5wk 6wk 7wk 8wk 9wk 10wk 11wk 12wk
-------------- -------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
21-00001-00010 塑胶A 500 400 8000 60 0 40 0 10 0 0 0 0 0 0 0 0
21-00002-00020 塑胶B 100 0 300 0 0 0 0 0 0 0 0 0 0 0 0 0
21-00002-00030 塑胶C 200 600 0 0 0 130 0 0 0 0 0 0 0 0 40 0
*/
回复
[Quote=引用 11 楼 zsh0809 的回复:]
引用 10 楼 hao1hao2hao3 的回复:

引用 9 楼 zsh0809 的回复:
引用 8 楼 wangxiaofeiwuqiao 的回复:

谁可怜下我啊,分不够我再加嘛。我自己真的没办法

国歌已经在给你处理了,别急,再等2分钟就好了。


谁说的,交给你吧!我也要上班的。太麻烦了。

那等我晚上的吧,今晚不陪女人吃饭给你处理~~
[/Quote]
感激不尽。
回复
[Quote=引用 10 楼 hao1hao2hao3 的回复:]
引用 9 楼 zsh0809 的回复:
引用 8 楼 wangxiaofeiwuqiao 的回复:

谁可怜下我啊,分不够我再加嘛。我自己真的没办法

国歌已经在给你处理了,别急,再等2分钟就好了。


谁说的,交给你吧!我也要上班的。太麻烦了。
[/Quote]
我由天上掉到地下。
回复
zsh0809 2010-09-21
[Quote=引用 10 楼 hao1hao2hao3 的回复:]

引用 9 楼 zsh0809 的回复:
引用 8 楼 wangxiaofeiwuqiao 的回复:

谁可怜下我啊,分不够我再加嘛。我自己真的没办法

国歌已经在给你处理了,别急,再等2分钟就好了。


谁说的,交给你吧!我也要上班的。太麻烦了。
[/Quote]
那等我晚上的吧,今晚不陪女人吃饭给你处理~~
回复
hao1hao2hao3 2010-09-21
[Quote=引用 9 楼 zsh0809 的回复:]
引用 8 楼 wangxiaofeiwuqiao 的回复:

谁可怜下我啊,分不够我再加嘛。我自己真的没办法

国歌已经在给你处理了,别急,再等2分钟就好了。
[/Quote]

谁说的,交给你吧!我也要上班的。太麻烦了。
回复
zsh0809 2010-09-21
[Quote=引用 8 楼 wangxiaofeiwuqiao 的回复:]

谁可怜下我啊,分不够我再加嘛。我自己真的没办法
[/Quote]
国歌已经在给你处理了,别急,再等2分钟就好了。
回复
谁可怜下我啊,分不够我再加嘛。我自己真的没办法
回复
zsh0809 2010-09-21
[Quote=引用 5 楼 ws_hgo 的回复:]

引用 2 楼 hao1hao2hao3 的回复:

引用 1 楼 ws_hgo 的回复:
你怎么每次发帖
都是一大堆东西啊


呵呵!这是考验体力、脑力和耐心的时候啊!

交给你啦
我撤退
[/Quote]
我也撤退,都没那么多时间来分析。
一边要上班,一边要搞csdn,好忙啊
回复
我也没办法啊,
回复
ws_hgo 2010-09-21
[Quote=引用 2 楼 hao1hao2hao3 的回复:]

引用 1 楼 ws_hgo 的回复:
你怎么每次发帖
都是一大堆东西啊


呵呵!这是考验体力、脑力和耐心的时候啊!
[/Quote]
交给你啦
我撤退
回复
忘了说了,数据库环境是: sql server 2000 ,不是 2005。
回复
zsh0809 2010-09-21
[Quote=引用 2 楼 hao1hao2hao3 的回复:]

引用 1 楼 ws_hgo 的回复:
你怎么每次发帖
都是一大堆东西啊


呵呵!这是考验体力、脑力和耐心的时候啊!
[/Quote]
相当考验
回复
hao1hao2hao3 2010-09-21
[Quote=引用 1 楼 ws_hgo 的回复:]
你怎么每次发帖
都是一大堆东西啊
[/Quote]

呵呵!这是考验体力、脑力和耐心的时候啊!
回复
ws_hgo 2010-09-21
你怎么每次发帖
都是一大堆东西啊
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-09-21 02:00
社区公告
暂无公告