单表统计上个班次

snlixing 2017-10-31 10:55:50
表设计如下
ID 产品ID 产量 桶号 日期 班次 入库标记
1 p111 10 A 2017-10-27 早班 0
2 p111 15 B 2017-10-27 早班 0
3 p111 25 A 2017-10-27 晚班 0
4 p111 30 B 2017-10-27 晚班 1
5 p111 10 C 2017-10-27 晚班 0
6 p111 30 A 2017-10-28 早班 0
7 p111 15 B 2017-10-28 早班 0

怎么求相同产品上一个班次的相同桶号的产量(用当班的减掉上一个班的,如入库标记为1,则当班相当于新桶)

10-27号早班
产品ID 当班产量 桶号 日期 班次
p111 10 A 2017-10-27 早班
p111 15 B 2017-10-27 早班

10-27号晚班
产品ID 当班产量(当班-上一个班) 桶号 日期 班次
p111 15 A 2017-10-27 晚班
p111 15 B 2017-10-27 晚班
p111 10 C 2017-10-27 晚班

10-28号早班
产品ID 当班产量(当班-上一个班) 桶号 日期 班次
p111 5 A 2017-10-27 晚班
p111 15(上个班入库标记为1,本班重新计算) B 2017-10-27 晚班
...全文
519 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
snlixing 2017-11-04
  • 打赏
  • 举报
回复
引用 23 楼 ayalicer 的回复:
然后 之后再来个 相同产品 不同桶号 你还有什么问题 一次全部提出来不会?
然后就没有然后了。。。
  • 打赏
  • 举报
回复
然后 之后再来个 相同产品 不同桶号 你还有什么问题 一次全部提出来不会?
  • 打赏
  • 举报
回复
O(∩_∩)O哈哈~ 自己sum先就是了
snlixing 2017-11-03
  • 打赏
  • 举报
回复
引用 19 楼 ayalicer 的回复:
一开始就该 列全元素嘛,每次说一点 改一点
declare @t table(ID int,产品ID varchar(10),产量 decimal(10,2), 桶号 varchar(10) , 日期 date, 班次 varchar(10), 入库标记 int)
insert @t select '1','p111','10','A','2017-10-27','早班','0'
insert @t select '2','p111','15','B','2017-10-27','早班','0'
insert @t select '3','p111','25','A','2017-10-27','晚班','0'
insert @t select '4','p111','30','B','2017-10-27','晚班','1'
insert @t select '5','p111','10','C','2017-10-27','晚班','0'
insert @t select '6','p111','30','A','2017-10-28','早班','0'
insert @t select '7','p111','15','B','2017-10-28','早班','0'
insert @t select '8','p111','5','C','2017-10-27','早班','0'
declare @t2 table(id int,桶号 varchar(10),桶重 decimal(10,2))
insert @t2 select 1,'A',7.1
insert @t2 select 1,'B',6.1
insert @t2 select 1,'C',3.1

;with t as(select rid=row_number()over(order by 日期 ,班次 desc),* from @t)
select 
    产品id
    ,产量
    ,a.桶号
    ,日期
    ,班次
	,当班产量=产量-isnull((select b.产量*(1-入库标记) from t b where rid=(select max(rid) from t c where a.桶号=c.桶号 and c.rid <a.rid)),isnull(t2.桶重,0)) 
from t a left join @t2 t2 on a.桶号 =t2.桶号
order by rid
产品id	产量	桶号	日期	班次	当班产量
p111	10.00	A	2017-10-27	早班	2.90
p111	15.00	B	2017-10-27	早班	8.90
p111	5.00	C	2017-10-27	早班	1.90
p111	25.00	A	2017-10-27	晚班	15.00
p111	30.00	B	2017-10-27	晚班	15.00
p111	10.00	C	2017-10-27	晚班	5.00
p111	30.00	A	2017-10-28	早班	5.00
p111	15.00	B	2017-10-28	早班	15.00
现在遇到同一个班同一款产品桶号相同的了,这样算出来的就不对了,需要按桶号合并
snlixing 2017-11-03
  • 打赏
  • 举报
回复
引用 21 楼 ayalicer 的回复:
O(∩_∩)O哈哈~ 自己sum先就是了
在哪加sum
  • 打赏
  • 举报
回复
一开始就该 列全元素嘛,每次说一点 改一点
declare @t table(ID int,产品ID varchar(10),产量 decimal(10,2), 桶号 varchar(10) , 日期 date, 班次 varchar(10), 入库标记 int)
insert @t select '1','p111','10','A','2017-10-27','早班','0'
insert @t select '2','p111','15','B','2017-10-27','早班','0'
insert @t select '3','p111','25','A','2017-10-27','晚班','0'
insert @t select '4','p111','30','B','2017-10-27','晚班','1'
insert @t select '5','p111','10','C','2017-10-27','晚班','0'
insert @t select '6','p111','30','A','2017-10-28','早班','0'
insert @t select '7','p111','15','B','2017-10-28','早班','0'
insert @t select '8','p111','5','C','2017-10-27','早班','0'
declare @t2 table(id int,桶号 varchar(10),桶重 decimal(10,2))
insert @t2 select 1,'A',7.1
insert @t2 select 1,'B',6.1
insert @t2 select 1,'C',3.1

;with t as(select rid=row_number()over(order by 日期 ,班次 desc),* from @t)
select 
    产品id
    ,产量
    ,a.桶号
    ,日期
    ,班次
	,当班产量=产量-isnull((select b.产量*(1-入库标记) from t b where rid=(select max(rid) from t c where a.桶号=c.桶号 and c.rid <a.rid)),isnull(t2.桶重,0)) 
from t a left join @t2 t2 on a.桶号 =t2.桶号
order by rid
产品id	产量	桶号	日期	班次	当班产量
p111	10.00	A	2017-10-27	早班	2.90
p111	15.00	B	2017-10-27	早班	8.90
p111	5.00	C	2017-10-27	早班	1.90
p111	25.00	A	2017-10-27	晚班	15.00
p111	30.00	B	2017-10-27	晚班	15.00
p111	10.00	C	2017-10-27	晚班	5.00
p111	30.00	A	2017-10-28	早班	5.00
p111	15.00	B	2017-10-28	早班	15.00
snlixing 2017-11-01
  • 打赏
  • 举报
回复
引用 17 楼 qq_37170555 的回复:
[quote=引用 16 楼 snlixing 的回复:] [quote=引用 3 楼 qq_37170555 的回复:]

use Tempdb
go
--> --> 听雨停了-->生成测试数据
if not object_id(N'Tempdb..#tab') is null
	drop table #tab
Go
Create table #tab([ID] int,[产品ID] nvarchar(24),[产量] int,[桶号] nvarchar(21),[日期] Date,[班次] nvarchar(22),[入库标记] int)
Insert #tab
select 1,N'p111',10,N'A','2017-10-27',N'早班',0 union all
select 2,N'p111',15,N'B','2017-10-27',N'早班',0 union all
select 3,N'p111',25,N'A','2017-10-27',N'晚班',0 union all
select 4,N'p111',30,N'B','2017-10-27',N'晚班',1 union all
select 5,N'p111',10,N'C','2017-10-27',N'晚班',0 union all
select 6,N'p111',30,N'A','2017-10-28',N'早班',0 union all
select 7,N'p111',15,N'B','2017-10-28',N'早班',0
GO
--测试数据结束
;WITH cte AS (
          SELECT *,
                 ROW_NUMBER() OVER(PARTITION BY 桶号 ORDER BY 日期 ASC, 班次 DESC) AS 
                 rn
          FROM   #tab
      )
 SELECT a.ID,a.产品ID,a.产量,a.桶号,a.日期,a.班次,a.入库标记,
        ISNULL(
            CASE b.[入库标记]
                 WHEN 1 THEN a.产量
                 ELSE a.产量 -b.产量
            END,
            a.产量
        )     AS 当班产量
 FROM   cte a
        LEFT JOIN cte b
             ON  a.桶号 = b.桶号
             AND a.rn = b.rn + 1
 ORDER BY
        日期  ASC,
        班次 
这个怎么减掉相应的桶重呢,只有减掉桶重才是净重[/quote] 你这个数据里没有桶重啊[/quote] 有一个桶表 ID 桶号 桶重 1 A 7.1
听雨停了 2017-11-01
  • 打赏
  • 举报
回复
引用 16 楼 snlixing 的回复:
[quote=引用 3 楼 qq_37170555 的回复:]

use Tempdb
go
--> --> 听雨停了-->生成测试数据
if not object_id(N'Tempdb..#tab') is null
	drop table #tab
Go
Create table #tab([ID] int,[产品ID] nvarchar(24),[产量] int,[桶号] nvarchar(21),[日期] Date,[班次] nvarchar(22),[入库标记] int)
Insert #tab
select 1,N'p111',10,N'A','2017-10-27',N'早班',0 union all
select 2,N'p111',15,N'B','2017-10-27',N'早班',0 union all
select 3,N'p111',25,N'A','2017-10-27',N'晚班',0 union all
select 4,N'p111',30,N'B','2017-10-27',N'晚班',1 union all
select 5,N'p111',10,N'C','2017-10-27',N'晚班',0 union all
select 6,N'p111',30,N'A','2017-10-28',N'早班',0 union all
select 7,N'p111',15,N'B','2017-10-28',N'早班',0
GO
--测试数据结束
;WITH cte AS (
          SELECT *,
                 ROW_NUMBER() OVER(PARTITION BY 桶号 ORDER BY 日期 ASC, 班次 DESC) AS 
                 rn
          FROM   #tab
      )
 SELECT a.ID,a.产品ID,a.产量,a.桶号,a.日期,a.班次,a.入库标记,
        ISNULL(
            CASE b.[入库标记]
                 WHEN 1 THEN a.产量
                 ELSE a.产量 -b.产量
            END,
            a.产量
        )     AS 当班产量
 FROM   cte a
        LEFT JOIN cte b
             ON  a.桶号 = b.桶号
             AND a.rn = b.rn + 1
 ORDER BY
        日期  ASC,
        班次 
这个怎么减掉相应的桶重呢,只有减掉桶重才是净重[/quote] 你这个数据里没有桶重啊
snlixing 2017-11-01
  • 打赏
  • 举报
回复
引用 3 楼 qq_37170555 的回复:

use Tempdb
go
--> --> 听雨停了-->生成测试数据
if not object_id(N'Tempdb..#tab') is null
	drop table #tab
Go
Create table #tab([ID] int,[产品ID] nvarchar(24),[产量] int,[桶号] nvarchar(21),[日期] Date,[班次] nvarchar(22),[入库标记] int)
Insert #tab
select 1,N'p111',10,N'A','2017-10-27',N'早班',0 union all
select 2,N'p111',15,N'B','2017-10-27',N'早班',0 union all
select 3,N'p111',25,N'A','2017-10-27',N'晚班',0 union all
select 4,N'p111',30,N'B','2017-10-27',N'晚班',1 union all
select 5,N'p111',10,N'C','2017-10-27',N'晚班',0 union all
select 6,N'p111',30,N'A','2017-10-28',N'早班',0 union all
select 7,N'p111',15,N'B','2017-10-28',N'早班',0
GO
--测试数据结束
;WITH cte AS (
          SELECT *,
                 ROW_NUMBER() OVER(PARTITION BY 桶号 ORDER BY 日期 ASC, 班次 DESC) AS 
                 rn
          FROM   #tab
      )
 SELECT a.ID,a.产品ID,a.产量,a.桶号,a.日期,a.班次,a.入库标记,
        ISNULL(
            CASE b.[入库标记]
                 WHEN 1 THEN a.产量
                 ELSE a.产量 -b.产量
            END,
            a.产量
        )     AS 当班产量
 FROM   cte a
        LEFT JOIN cte b
             ON  a.桶号 = b.桶号
             AND a.rn = b.rn + 1
 ORDER BY
        日期  ASC,
        班次 
这个怎么减掉相应的桶重呢,只有减掉桶重才是净重
  • 打赏
  • 举报
回复
insert @t select '8','p111','5','c','2017-10-27','早班','0' 这个结果不对 我感觉你原始数据的问题吧 难道越生产数量越少?
snlixing 2017-10-31
  • 打赏
  • 举报
回复
引用 9 楼 qq_37170555 的回复:
[quote=引用 7 楼 snlixing 的回复:] [quote=引用 6 楼 qq_37170555 的回复:] [quote=引用 5 楼 snlixing 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
惭愧惭愧,数据结构总是变[/quote] 试试我上面写的[/quote] 再增加一个新产品ID,结果也不对,添加select 8,N'p112',12,N'A','2017-10-27',N'晚班',0[/quote] 这么简单的逻辑你自己也可以处理了嘛,还说出来的结果也不对干啥呢[/quote] 惭愧惭愧,我还是卖水果去吧
听雨停了 2017-10-31
  • 打赏
  • 举报
回复
引用 7 楼 snlixing 的回复:
[quote=引用 6 楼 qq_37170555 的回复:] [quote=引用 5 楼 snlixing 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
惭愧惭愧,数据结构总是变[/quote] 试试我上面写的[/quote] 再增加一个新产品ID,结果也不对,添加select 8,N'p112',12,N'A','2017-10-27',N'晚班',0[/quote] 这么简单的逻辑你自己也可以处理了嘛,还说出来的结果也不对干啥呢
听雨停了 2017-10-31
  • 打赏
  • 举报
回复
引用 7 楼 snlixing 的回复:
[quote=引用 6 楼 qq_37170555 的回复:] [quote=引用 5 楼 snlixing 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
惭愧惭愧,数据结构总是变[/quote] 试试我上面写的[/quote] 再增加一个新产品ID,结果也不对,添加select 8,N'p112',12,N'A','2017-10-27',N'晚班',0[/quote] PARTITION BY 桶号 改成PARTITION BY 产品ID,桶号就可以了
snlixing 2017-10-31
  • 打赏
  • 举报
回复
引用 6 楼 qq_37170555 的回复:
[quote=引用 5 楼 snlixing 的回复:] [quote=引用 2 楼 sinat_28984567 的回复:] 怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
惭愧惭愧,数据结构总是变[/quote] 试试我上面写的[/quote] 再增加一个新产品ID,结果也不对,添加select 8,N'p112',12,N'A','2017-10-27',N'晚班',0
听雨停了 2017-10-31
  • 打赏
  • 举报
回复
引用 5 楼 snlixing 的回复:
[quote=引用 2 楼 sinat_28984567 的回复:] 怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
惭愧惭愧,数据结构总是变[/quote] 试试我上面写的
snlixing 2017-10-31
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
惭愧惭愧,数据结构总是变
snlixing 2017-10-31
  • 打赏
  • 举报
回复
引用 1 楼 ayalicer 的回复:
declare @t table(ID int,产品ID varchar(10),产量 int, 桶号 varchar(10), 日期 date, 班次 varchar(10), 入库标记 int)
insert @t select '1','p111','10','A','2017-10-27','早班','0'
insert @t select '2','p111','15','B','2017-10-27','早班','0'
insert @t select '3','p111','25','A','2017-10-27','晚班','0'
insert @t select '4','p111','30','B','2017-10-27','晚班','1'
insert @t select '5','p111','10','C','2017-10-27','晚班','0'
insert @t select '6','p111','30','A','2017-10-28','早班','0'
insert @t select '7','p111','15','B','2017-10-28','早班','0'

select 
	产品id
	,产量-isnull((select b.产量*(1-入库标记) from @t b where id=(select max(id) from @t c where a.桶号=c.桶号 and c.ID <a.ID)),0)
	,桶号
	,日期
	,班次 
from @t a
order by id
/*
产品id	(无列名)	桶号	日期	班次
p111	10	A	2017-10-27	早班
p111	15	B	2017-10-27	早班
p111	15	A	2017-10-27	晚班
p111	15	B	2017-10-27	晚班
p111	10	C	2017-10-27	晚班
p111	5	A	2017-10-28	早班
p111	15	B	2017-10-28	早班
*/
这样写有问题的,再添加一条insert @t select '8','p111','5','c','2017-10-27','早班','0',算出来就不对了
听雨停了 2017-10-31
  • 打赏
  • 举报
回复

use Tempdb
go
--> --> 听雨停了-->生成测试数据
if not object_id(N'Tempdb..#tab') is null
drop table #tab
Go
Create table #tab([ID] int,[产品ID] nvarchar(24),[产量] int,[桶号] nvarchar(21),[日期] Date,[班次] nvarchar(22),[入库标记] int)
Insert #tab
select 1,N'p111',10,N'A','2017-10-27',N'早班',0 union all
select 2,N'p111',15,N'B','2017-10-27',N'早班',0 union all
select 3,N'p111',25,N'A','2017-10-27',N'晚班',0 union all
select 4,N'p111',30,N'B','2017-10-27',N'晚班',1 union all
select 5,N'p111',10,N'C','2017-10-27',N'晚班',0 union all
select 6,N'p111',30,N'A','2017-10-28',N'早班',0 union all
select 7,N'p111',15,N'B','2017-10-28',N'早班',0
GO
--测试数据结束
;WITH cte AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY 桶号 ORDER BY 日期 ASC, 班次 DESC) AS
rn
FROM #tab
)
SELECT a.ID,a.产品ID,a.产量,a.桶号,a.日期,a.班次,a.入库标记,
ISNULL(
CASE b.[入库标记]
WHEN 1 THEN a.产量
ELSE a.产量 -b.产量
END,
a.产量
) AS 当班产量
FROM cte a
LEFT JOIN cte b
ON a.桶号 = b.桶号
AND a.rn = b.rn + 1
ORDER BY
日期 ASC,
班次

二月十六 版主 2017-10-31
  • 打赏
  • 举报
回复
怎么感觉楼主这个问题好像问了好多次了……还没彻底解决么
  • 打赏
  • 举报
回复
declare @t table(ID int,产品ID varchar(10),产量 int, 桶号 varchar(10), 日期 date, 班次 varchar(10), 入库标记 int)
insert @t select '1','p111','10','A','2017-10-27','早班','0'
insert @t select '2','p111','15','B','2017-10-27','早班','0'
insert @t select '3','p111','25','A','2017-10-27','晚班','0'
insert @t select '4','p111','30','B','2017-10-27','晚班','1'
insert @t select '5','p111','10','C','2017-10-27','晚班','0'
insert @t select '6','p111','30','A','2017-10-28','早班','0'
insert @t select '7','p111','15','B','2017-10-28','早班','0'

select 
	产品id
	,产量-isnull((select b.产量*(1-入库标记) from @t b where id=(select max(id) from @t c where a.桶号=c.桶号 and c.ID <a.ID)),0)
	,桶号
	,日期
	,班次 
from @t a
order by id
/*
产品id	(无列名)	桶号	日期	班次
p111	10	A	2017-10-27	早班
p111	15	B	2017-10-27	早班
p111	15	A	2017-10-27	晚班
p111	15	B	2017-10-27	晚班
p111	10	C	2017-10-27	晚班
p111	5	A	2017-10-28	早班
p111	15	B	2017-10-28	早班
*/
加载更多回复(4)

34,576

社区成员

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

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