--每一個產品都有一系列相關的條碼表
每一個大貨條碼,他要做的工序有長有短,而且做的順序通過工單順序號來決定,像例子中的資料,就是有2種大貨成品,共三臺,其中12kw機芯有2臺,
每臺都要經歷機芯組裝A,機芯組裝B,機芯組裝C,機芯組裝D,機芯組裝E共五個工序,另外一臺成品12KW單炒無尾需要激光,折彎,焊接,組裝,測驗,
清晰打包,成品入庫,共7個工序,求一個sql陳述句,得到下面結果
大貨條碼 ,銷售訂單數量,下單時間 ,交期 ,產品代碼 ,產品名稱 ,產品規格 ,客戶代碼,生產數量,生產明細備注,生產說明,跟單 ,設計人,訂單號,客戶名稱,職員名稱,生產任務單號,制單時間,(動態工序部分),工序1代碼,工序1名稱,工序2代碼,工序2名稱,...工序7代碼,工序7名稱,[因為示例資料三個產品,最多是7個工序]
BP18-0002*M210307010*20210307*001 , ,省略,,,'機芯組裝A','000004*8*BP18-0002','機芯組裝A','000004*8*BP18-0002','機芯組裝B','000004*9*BP18-0002','機芯組裝C','000004*10*BP18-0002','機芯組裝D','000004*11*BP18-0002','機芯組裝E','000004*12*BP18-0002',NULL,NULL,NULL,NULL
BP18-0002*M210307010*20210307*002 , ,省略,,,'機芯組裝A','000004*8*BP18-0002','機芯組裝A','000004*8*BP18-0002','機芯組裝B','000004*9*BP18-0002','機芯組裝C','000004*10*BP18-0002','機芯組裝D','000004*11*BP18-0002','機芯組裝E','000004*12*BP18-0002',NULL,NULL,NULL,NULLCREATE TABLE #temp222(工單順序號 int,工單號 VARCHAR(20),大貨條碼 VARCHAR(80) ,
FCP01-201-0472*M210307010*20210307*001 , ,省略,,,'激光','000001*1','折彎','000001*2','焊接','000001*3','組裝','000001*4','測驗','000001*5','清洗打包','000001*6','成品入庫','000001*7',,NULL,NULL
CREATE TABLE #temp222(工單順序號 int,工單號 VARCHAR(20),大貨條碼 VARCHAR(80) ,
工序排序號 int,銷售訂單數量 DECIMAL(18,4),下單時間 Date,交期 Date,產品代碼 VARCHAR(80) ,
產品名稱 VARCHAR(80) ,產品規格 VARCHAR(80) ,客戶代碼 VARCHAR(80) ,工序名稱 VARCHAR(80) ,
工序條碼 VARCHAR(80) ,生產數量 DECIMAL(18,4),生產明細備注 VARCHAR(120),生產物料代碼 VARCHAR(80),
生產物料名稱 VARCHAR(80),生產說明 VARCHAR(80),線路號 VARCHAR(20),跟單 VARCHAR(20),線路名稱 VARCHAR(80),
設計人 VARCHAR(80),訂單號 VARCHAR(80),客戶名稱 VARCHAR(80),職員名稱 VARCHAR(80),生產任務單號 VARCHAR(80),
制單時間 Date
)
insert into #temp222 values(1,'046711','BP18-0002*M210307010*20210307*001',1,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝A','000004*8*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(2,'046712','BP18-0002*M210307010*20210307*001',2,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝B','000004*9*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(3,'046713','BP18-0002*M210307010*20210307*001',3,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝C','000004*10*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(4,'046714','BP18-0002*M210307010*20210307*001',4,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝D','000004*11*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(5,'046715','BP18-0002*M210307010*20210307*001',5,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝E','000004*12*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(6,'046716','BP18-0002*M210307010*20210307*002',1,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝A','000004*8*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(7,'046717','BP18-0002*M210307010*20210307*002',2,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝B','000004*9*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(8,'046718','BP18-0002*M210307010*20210307*002',3,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝C','000004*10*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(9,'046719','BP18-0002*M210307010*20210307*002',4,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝D','000004*11*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(10,'046720','BP18-0002*M210307010*20210307*002',5,0.00,NULL,NULL,'BP18-0002','12kW機芯','411*173*155mm',NULL ,'機芯組裝E','000004*12*BP18-0002',2,null,'BP18-0002','12kW機芯',null,'000004',NULL,'機芯組裝',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(11,'046726','FCP01-201-0472*M210307010*20210307*001',1,0.00,NULL,NULL,'FCP01-201-0472','12KW單炒無尾','411**155mm',NULL ,'激光','000001*1',1,null,'FCP01-201-0472-1','12kW單炒無尾-外殼鈑金料領用',null,'000001',NULL,'激光折彎',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(12,'046727','FCP01-201-0472*M210307010*20210307*001',2,0.00,NULL,NULL,'FCP01-201-0472','12kW單炒無尾','411**155mm',NULL ,'折彎','000001*2',1,null,'FCP01-201-0472-1','12kW單炒無尾-外殼鈑金料領用',null,'000001',NULL,'激光折彎',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(13,'046725','FCP01-201-0472*M210307010*20210307*001',1,0.00,NULL,NULL,'FCP01-201-0472','12kW單炒無尾','411**155mm',NULL ,'焊接','000002*3',1,null,'FCP01-201-0472-0','12kW單炒無尾-外殼',null,'000002',NULL,'焊接',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(14,'046721','FCP01-201-0472*M210307010*20210307*001',1,0.00,NULL,NULL,'FCP01-201-0472','12kW單炒無尾','411**155mm',NULL ,'組裝','000003*4',1,null,'FCP01-201-0472','12KW-單炒無尾',null,'000003',NULL,'組裝測驗清洗',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(15,'046722','FCP01-201-0472*M210307010*20210307*001',2,0.00,NULL,NULL,'FCP01-201-0472','12kW單炒無尾','411**155mm',NULL ,'測驗','000003*5',1,null,'FCP01-201-0472','12KW-單炒無尾',null,'000003',NULL,'組裝測驗清洗',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(16,'046723','FCP01-201-0472*M210307010*20210307*001',3,0.00,NULL,NULL,'FCP01-201-0472','12kW單炒無尾','411**155mm',NULL ,'清洗打包','000003*6',1,null,'FCP01-201-0472','12KW-單炒無尾',null,'000003',NULL,'組裝測驗清洗',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
insert into #temp222 values(17,'046724','FCP01-201-0472*M210307010*20210307*001',4,0.00,NULL,NULL,'FCP01-201-0472','12kW單炒無尾','411**155mm',NULL ,'成品入庫','000003*7',1,null,'FCP01-201-0472','12KW-單炒無尾',null,'000003',NULL,'組裝測驗清洗',NULL,NULL,NULL,'ERP維護','M210307010','2021-03-07 22:26:51.000')
相當于原來產品結構是這樣
產品 , 工序代碼,工序名稱,制作順序
A 1 , 01 ,機芯組裝A ,1
A1 , 01 ,機芯組裝B ,2
A 2 , 01 ,機芯組裝A ,1
A2 , 01 ,機芯組裝B ,2
A3 , 01 ,機芯組裝A ,1
A3 , 01 ,機芯組裝B ,2
A3 , 01 ,機芯組裝C ,3
改成
產品,工序代碼1,工序名稱1,工序代碼2,工序名稱2,工序代碼3,工序名稱3 ,這里的列取決于某個產品最多的工序
A1 , 01 , 機芯組裝A ,02,機芯組裝B
A2, 01 , 機芯組裝A ,02,機芯組裝B
A3, 01 , 機芯組裝A ,02,機芯組裝B,03,機芯組裝C
uj5u.com熱心網友回復:
每一個大貨條碼,他要做的工序有長有短,而且做的順序通過工單順序號來決定,像例子中的資料,就是有2種大貨成品,共三臺,其中12kw機芯有2臺,每臺都要經歷機芯組裝A,機芯組裝B,機芯組裝C,機芯組裝D,機芯組裝E共五個工序,另外一臺成品12KW單炒無尾需要激光,折彎,焊接,組裝,測驗,
清晰打包,成品入庫,共7個工序,求一個sql陳述句,得到下面結果
大貨條碼 ,銷售訂單數量,下單時間 ,交期 ,產品代碼 ,產品名稱 ,產品規格 ,客戶代碼,生產數量,生產明細備注,生產說明,跟單 ,設計人,訂單號,客戶名稱,職員名稱,生產任務單號,制單時間,(動態工序部分),工序1代碼,工序1名稱,工序2代碼,工序2名稱,...工序7代碼,工序7名稱,[因為示例資料三個產品,最多是7個工序]
uj5u.com熱心網友回復:
拼接SQL來處理就好了,取出最大工序的值,配合PIVOT函式轉換。但看不出來你的工序排序是什么規則呢?
uj5u.com熱心網友回復:
看到條碼是有一定的規則的,時間有限,僅提供思路:如果是一次性的話,用union的方式,對于每個大貨條碼進行case when的行列轉化,三個產品就做三次。
如果是想做的靈活一些,建議用存盤程序,建立回圈,對每一個大貨條碼進行遍歷,直到所有的條碼全部遍歷完成。
希望能幫到你
uj5u.com熱心網友回復:
其實主要的問題就是多列的處理,用values來轉成行,然后拼接一下工序列,有多少個就拼多少個出來,這個也簡單,組成動態陳述句后用exec執行一下就可以了,下面是固定的寫法,7個工序的:
WITH tempWithSeq AS (SELECT 大貨條碼 ,銷售訂單數量,下單時間 ,交期 ,產品代碼 ,產品名稱 ,產品規格 ,客戶代碼,生產數量,生產明細備注,生產說明,跟單 ,設計人,訂單號,客戶名稱,職員名稱,生產任務單號,制單時間, 工序條碼, 工序名稱, ROW_NUMBER() OVER (PARTITION BY 大貨條碼 ORDER BY 工單順序號) AS SEQ FROM #temp222),
ExpandCol AS (SELECT 大貨條碼 ,銷售訂單數量,下單時間 ,交期 ,產品代碼 ,產品名稱 ,產品規格 ,客戶代碼,生產數量,生產明細備注,生產說明,跟單 ,設計人,訂單號,客戶名稱,職員名稱,生產任務單號,制單時間, v.col,v.value
FROM tempWithSeq
CROSS APPLY (VALUES ('工序' + CAST(SEQ AS VARCHAR(10)) + '條碼', 工序條碼),
('工序' + CAST(SEQ AS VARCHAR(10)) + '名稱', 工序名稱)) v (col, value) )
SELECT * FROM ExpandCol PIVOT (MAX(value) FOR col IN ([工序1條碼],[工序1名稱],[工序2條碼],[工序2名稱],[工序3條碼]
,[工序3名稱],[工序4條碼],[工序4名稱],[工序5條碼],[工序5名稱],[工序6條碼],[工序6名稱],[工序7條碼],[工序7名稱])) p
uj5u.com熱心網友回復:
結果不對,這里要最大多少個工序,就多少列,然后工序1,工序2,工序3這樣有別名uj5u.com熱心網友回復:
不知道為何在我的資料庫里面總是提示分號附近有錯誤,是不是資料庫版本問題'(' 附近有語法錯誤
uj5u.com熱心網友回復:
什么版本的SQL?with前面加個;看看
uj5u.com熱心網友回復:
這個可以滿足了
if OBJECT_ID (N'tempdb...#temp222II') is null
drop table #temp222II
go
Select *,'工序'+ cast(工序排序號 as varchar(10)) as 工序 INto #temp222II From #temp222
declare @name varchar(max),@sql varchar(max)
set @name = STUFF((select distinct ',['+工序+']' from #temp222II for xml path('')),1,1,'')
set @sql = 'select * from (select 大貨條碼 as 大貨條碼A,工序名稱,工序 from #temp222II ) a
pivot (max(工序名稱) for 工序 in('+@name+'))a'
set @sql = 'select distinct A.大貨條碼,銷售訂單數量,下單時間,交期,產品代碼,產品名稱,產品規格,客戶代碼,生產數量,
生產明細備注,生產說明,跟單,設計人,訂單號,客戶名稱,職員名稱,生產任務單號,制單時間,B.*
From #temp222II A left Join(' +@sql+ ')B ON A.大貨條碼 = B.大貨條碼A'
print @sql
exec (@sql)
go
uj5u.com熱心網友回復:
DECLARE @sql VARCHAR(max)=''
SELECT
@sql=@sql
+',max(case when 工序排序號='+CONVERT(VARCHAR(10),工序排序號)+' then 工序名稱 else null end) as 工序名稱'+CONVERT(VARCHAR(10),工序排序號)
+',max(case when 工序排序號='+CONVERT(VARCHAR(10),工序排序號)+' then 工序條碼 else null end) as 工序條碼'+CONVERT(VARCHAR(10),工序排序號) +CHAR(13)
FROM
(
SELECT 工序排序號 FROM #temp222 GROUP BY 工序排序號
) a
SET @sql='select 大貨條碼'+@sql+' from #temp222 group by 大貨條碼'
EXEC(@sql)
DROP TABLE #temp222
感覺這個方法非常實用,http://bbs.csdn.net/topics/398467884 6#的方法
uj5u.com熱心網友回復:
DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL=ISNULL(@SQL+',','')+'['+'工序代碼'+CAST(RN AS VARCHAR(10))+'],'+'['+'工序名稱'+CAST(RN AS VARCHAR(10))+']'
FROM (SELECT DISTINCT RN FROM (SELECT ROW_NUMBER() OVER (PARTITION BY 大貨條碼 ORDER BY 工單順序號) AS RN FROM #temp222) AS A) AS B
ORDER BY RN
SET @SQL='WITH CTE
AS
(SELECT *,ROW_NUMBER() OVER (PARTITION BY 大貨條碼 ORDER BY 工單順序號) AS RN FROM #temp222)
SELECT 大貨條碼,'+@SQL+'
FROM (SELECT 大貨條碼,工序名稱,''工序名稱''+CAST(RN AS VARCHAR(10)) AS TYPE FROM CTE
UNION ALL
SELECT 大貨條碼,工序條碼,''工序代碼''+CAST(RN AS VARCHAR(10)) AS TYPE FROM CTE) AS A
PIVOT (MAX(工序名稱) FOR TYPE IN ('+@SQL+')) AS B'
EXEC(@SQL)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/267614.html
標籤:疑難問題
上一篇:求大神解讀一句代碼
下一篇:請大佬教我一下
