求SQL语句,该功能怎么写

时间:2022-04-30 03:04:05
数据库有张表名为"生产订单计划";数据内容大概如下:
客户编码(关键字)  铸件号    进度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


引用 3 楼 Dance3350 的回复:
感谢,但是我要实现的意思不是这个,假设今天是11月28日 我要从每个客户编码 从1日一值到28日的总和 显示在当日累计中, 因为我要看我当日要看实际完成了多少 月初给各客户的计划 
在行转列之前先算出门天的汇总存到新列,然后在行转列

#5


2楼代码中,
@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


引用 6 楼 Dance3350 的回复:
感谢4楼给了很大的提醒,但是有一个问题是:我打算把代码写成存储过程,让程序每日需要时自动运行,进度1到进度31是1号到31号,也就是列转行时 列数不定,是不是要用到SQL的循环啊
你这种应该要动态,特别是月份这种数据,天数往往都不固定

#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


引用 3 楼 Dance3350 的回复:
感谢,但是我要实现的意思不是这个,假设今天是11月28日 我要从每个客户编码 从1日一值到28日的总和 显示在当日累计中, 因为我要看我当日要看实际完成了多少 月初给各客户的计划 
在行转列之前先算出门天的汇总存到新列,然后在行转列

#5


2楼代码中,
@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


引用 6 楼 Dance3350 的回复:
感谢4楼给了很大的提醒,但是有一个问题是:我打算把代码写成存储过程,让程序每日需要时自动运行,进度1到进度31是1号到31号,也就是列转行时 列数不定,是不是要用到SQL的循环啊
你这种应该要动态,特别是月份这种数据,天数往往都不固定

#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;


是不是这个意思???