客户编码(关键字) 铸件号 进度1 进度2 进度3 进度4 进度5 进度6 ………………进度30 进度31
RFC010141 2402C-A 20 30 31 33 56 0 22 90
RFC010142 2802D-XX 40 0 37 56 44 5 43 70
RFC010154 3333Z-3E 50 9 45 50 40 50 143 170
………………
…………………………
KFC010159 5789X-3D 70 19 55 70 50 70 173 190
该表意思就是每个月初排的本月的生产订单计划从1日一直到31日;现在我需要实现的功能如下:假设今天是15日 我想查询每一行数据从进度1一直加到进度15的和;实现结果如下:AAA假设为每一行进度1一直到进度15的总和;
客户编码(关键字) 铸件号 当日累计 进度1 进度2 进度3 进度4 进度5 ………………进度30 进度31
RFC010141 2402C-A AAA 30 31 33 56 0 22 90
RFC010142 2802D-XX AAA 0 37 56 44 5 43 70
RFC010154 3333Z-3E AAA 9 45 50 40 50 143 170
………………
…………………………
KFC010159 5789X-3D AAA 19 55 70 50 70 173 190
12 个解决方案
#1
这是行列转换问题,搜索一下,论坛里很多
#2
进度31的表结构太长,在此以5天的为例,供参考.
create table 生产订单计划
(客户编码 varchar(10),铸件号 varchar(10),进度1 int,进度2 int,进度3 int,进度4 int,进度5 int)
insert into 生产订单计划
select 'RFC010141','2402C-A',20,30,31,33,56 union all
select 'RFC010142','2802D-XX',4,10,11,12,44 union all
select 'RFC010154','3333Z-3E',5,19,45,50,60 union all
select 'KFC010159','5789X-3D',7,29,55,70,90
declare @curdate int
select @curdate=2; --> 假设今天是2日
with t as
(select 客户编码,铸件号,v,
row_number() over(partition by 客户编码,铸件号 order by c) 'rn'
from 生产订单计划 a
unpivot(v for c in([进度1],[进度2],[进度3],[进度4],[进度5])) u)
select 客户编码,铸件号,
(select sum(v) from t y
where y.客户编码=x.客户编码 and y.铸件号=x.铸件号 and y.rn<=@curdate) '当日累计',
进度1,进度2,进度3,进度4,进度5
from 生产订单计划 x
/*
客户编码 铸件号 当日累计 进度1 进度2 进度3 进度4 进度5
---------- ---------- ----------- ----------- ----------- ----------- ----------- -----------
RFC010141 2402C-A 50 20 30 31 33 56
RFC010142 2802D-XX 14 4 10 11 12 44
RFC010154 3333Z-3E 24 5 19 45 50 60
KFC010159 5789X-3D 36 7 29 55 70 90
(4 row(s) affected)
*/
#3
感谢,但是我要实现的意思不是这个,假设今天是11月28日 我要从每个客户编码 从1日一值到28日的总和 显示在当日累计中, 因为我要看我当日要看实际完成了多少 月初给各客户的计划
#4
在行转列之前先算出门天的汇总存到新列,然后在行转列
#5
2楼代码中,
@curdate=2 即表示假设今天是2日.
结果中,[当日累计]字段的值,即等于进度1+进度2的值.
50 = 20 + 30
14 = 4 + 10
.
.
@curdate=2 即表示假设今天是2日.
结果中,[当日累计]字段的值,即等于进度1+进度2的值.
50 = 20 + 30
14 = 4 + 10
.
.
#6
感谢4楼给了很大的提醒,但是有一个问题是:我打算把代码写成存储过程,让程序每日需要时自动运行,进度1到进度31是1号到31号,也就是列转行时 列数不定,是不是要用到SQL的循环啊
#7
4L说的很对。。先统计好1-15的总和,在行专列,这样的话就不用循环累计添加了
#8
15号只是假设,也有可能是17号 16号 28号
#9
你这种应该要动态,特别是月份这种数据,天数往往都不固定
#10
怎么写啊 可以提点一下吗?
#11
牛人啊,我也来看看
#12
create PROC proc_日累计
AS
begin
DECLARE @sql VARCHAR(100)
DECLARE @iday INT
SET @iday = DAY(GETDATE());
SET @sql = 'select * , (0'
SELECT @sql = @sql +'+[进度'+ CAST(@iday AS VARCHAR(2))+']'
FROM master..spt_values tb
WHERE tb.number BETWEEN 1 AND @iday AND tb.type ='P'
SET @sql = @sql +') as [当日累计] from 生产订单计划'
EXEC(@sql)
END;
是不是这个意思???
#1
这是行列转换问题,搜索一下,论坛里很多
#2
进度31的表结构太长,在此以5天的为例,供参考.
create table 生产订单计划
(客户编码 varchar(10),铸件号 varchar(10),进度1 int,进度2 int,进度3 int,进度4 int,进度5 int)
insert into 生产订单计划
select 'RFC010141','2402C-A',20,30,31,33,56 union all
select 'RFC010142','2802D-XX',4,10,11,12,44 union all
select 'RFC010154','3333Z-3E',5,19,45,50,60 union all
select 'KFC010159','5789X-3D',7,29,55,70,90
declare @curdate int
select @curdate=2; --> 假设今天是2日
with t as
(select 客户编码,铸件号,v,
row_number() over(partition by 客户编码,铸件号 order by c) 'rn'
from 生产订单计划 a
unpivot(v for c in([进度1],[进度2],[进度3],[进度4],[进度5])) u)
select 客户编码,铸件号,
(select sum(v) from t y
where y.客户编码=x.客户编码 and y.铸件号=x.铸件号 and y.rn<=@curdate) '当日累计',
进度1,进度2,进度3,进度4,进度5
from 生产订单计划 x
/*
客户编码 铸件号 当日累计 进度1 进度2 进度3 进度4 进度5
---------- ---------- ----------- ----------- ----------- ----------- ----------- -----------
RFC010141 2402C-A 50 20 30 31 33 56
RFC010142 2802D-XX 14 4 10 11 12 44
RFC010154 3333Z-3E 24 5 19 45 50 60
KFC010159 5789X-3D 36 7 29 55 70 90
(4 row(s) affected)
*/
#3
感谢,但是我要实现的意思不是这个,假设今天是11月28日 我要从每个客户编码 从1日一值到28日的总和 显示在当日累计中, 因为我要看我当日要看实际完成了多少 月初给各客户的计划
#4
在行转列之前先算出门天的汇总存到新列,然后在行转列
#5
2楼代码中,
@curdate=2 即表示假设今天是2日.
结果中,[当日累计]字段的值,即等于进度1+进度2的值.
50 = 20 + 30
14 = 4 + 10
.
.
@curdate=2 即表示假设今天是2日.
结果中,[当日累计]字段的值,即等于进度1+进度2的值.
50 = 20 + 30
14 = 4 + 10
.
.
#6
感谢4楼给了很大的提醒,但是有一个问题是:我打算把代码写成存储过程,让程序每日需要时自动运行,进度1到进度31是1号到31号,也就是列转行时 列数不定,是不是要用到SQL的循环啊
#7
4L说的很对。。先统计好1-15的总和,在行专列,这样的话就不用循环累计添加了
#8
15号只是假设,也有可能是17号 16号 28号
#9
你这种应该要动态,特别是月份这种数据,天数往往都不固定
#10
怎么写啊 可以提点一下吗?
#11
牛人啊,我也来看看
#12
create PROC proc_日累计
AS
begin
DECLARE @sql VARCHAR(100)
DECLARE @iday INT
SET @iday = DAY(GETDATE());
SET @sql = 'select * , (0'
SELECT @sql = @sql +'+[进度'+ CAST(@iday AS VARCHAR(2))+']'
FROM master..spt_values tb
WHERE tb.number BETWEEN 1 AND @iday AND tb.type ='P'
SET @sql = @sql +') as [当日累计] from 生产订单计划'
EXEC(@sql)
END;
是不是这个意思???