通常计算制程直通率的时,需要用到累乘积计算功能,在EXCEL表中比较容易,在SQL中如何使用呢?
当前直通率=上一制程直通率*本制程直通率。
(1)循环遍历,游标(采用游标代码量比较多,而且效率低)
(2)SQL执行(需要08R2以上,我司目前是14版)EXP(sum(log([A])) over(order by XX ASC))
USE [OA]
GO
/****** Object: StoredProcedure [dbo].[DZ_ZRInspectionItemsDailyRpt] Script Date: 2020/3/9 9:09:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <David Gong>
-- Create date: <2020-03-06>
-- Description: <动态生成检验报表>
-- =============================================
ALTER Procedure [dbo].[DZ_ZRInspectionItemsDailyRpt]
(
@ProductSeries AS NVARCHAR(20) ,
@YearMonth AS CHAR(6)
)
AS
BEGIN
IF OBJECT_ID('tempdb..#T1') IS NOT NULL
BEGIN
DROP TABLE #T1
END
IF OBJECT_ID('tempdb..#T2') IS NOT NULL
BEGIN
DROP TABLE #T2
END
IF OBJECT_ID('tempdb..#T3') IS NOT NULL
BEGIN
DROP TABLE #T3
END
IF OBJECT_ID('tempdb..#T4') IS NOT NULL
BEGIN
DROP TABLE #T4
END
IF OBJECT_ID('tempdb..#T5') IS NOT NULL
BEGIN
DROP TABLE #T5
END
IF OBJECT_ID('tempdb..#T6') IS NOT NULL
BEGIN
DROP TABLE #T6
END
IF OBJECT_ID('tempdb..#T7') IS NOT NULL
BEGIN
DROP TABLE #T7
END
IF OBJECT_ID('tempdb..#ZT') IS NOT NULL
BEGIN
DROP TABLE #ZT
END
------产品品品收集---------------
CREATE TABLE #T1
(
RouteCode CHAR(20),
RouteName CHAR(20),
BadItem CHAR(20),
[01] CHAR(100),
[02] CHAR(100),
[03] CHAR(100),
[04] CHAR(100),
[05] CHAR(100),
[06] CHAR(100),
[07] CHAR(100),
[08] CHAR(100),
[09] CHAR(100),
[10] CHAR(100),
[11] CHAR(100),
[12] CHAR(100),
[13] CHAR(100),
[14] CHAR(100),
[15] CHAR(100),
[16] CHAR(100),
[17] CHAR(100),
[18] CHAR(100),
[19] CHAR(100),
[20] CHAR(100),
[21] CHAR(100),
[22] CHAR(100),
[23] CHAR(100),
[24] CHAR(100),
[25] CHAR(100),
[26] CHAR(100),
[27] CHAR(100),
[28] CHAR(100),
[29] CHAR(100),
[30] CHAR(100),
[31] CHAR(100)
)
------产品品品收集---------------
CREATE TABLE #T2
(
RouteCode CHAR(20),
RouteName CHAR(20),
BadItem CHAR(20),
[01] DECIMAL(18,4) DEFAULT(0),
[02] DECIMAL(18,4) DEFAULT(0),
[03] DECIMAL(18,4) DEFAULT(0),
[04] DECIMAL(18,4) DEFAULT(0),
[05] DECIMAL(18,4) DEFAULT(0),
[06] DECIMAL(18,4) DEFAULT(0),
[07] DECIMAL(18,4) DEFAULT(0),
[08] DECIMAL(18,4) DEFAULT(0),
[09] DECIMAL(18,4) DEFAULT(0),
[10] DECIMAL(18,4) DEFAULT(0),
[11] DECIMAL(18,4) DEFAULT(0),
[12] DECIMAL(18,4) DEFAULT(0),
[13] DECIMAL(18,4) DEFAULT(0),
[14] DECIMAL(18,4) DEFAULT(0),
[15] DECIMAL(18,4) DEFAULT(0),
[16] DECIMAL(18,4) DEFAULT(0),
[17] DECIMAL(18,4) DEFAULT(0),
[18] DECIMAL(18,4) DEFAULT(0),
[19] DECIMAL(18,4) DEFAULT(0),
[20] DECIMAL(18,4) DEFAULT(0),
[21] DECIMAL(18,4) DEFAULT(0),
[22] DECIMAL(18,4) DEFAULT(0),
[23] DECIMAL(18,4) DEFAULT(0),
[24] DECIMAL(18,4) DEFAULT(0),
[25] DECIMAL(18,4) DEFAULT(0),
[26] DECIMAL(18,4) DEFAULT(0),
[27] DECIMAL(18,4) DEFAULT(0),
[28] DECIMAL(18,4) DEFAULT(0),
[29] DECIMAL(18,4) DEFAULT(0),
[30] DECIMAL(18,4) DEFAULT(0),
[31] DECIMAL(18,4) DEFAULT(0)
)
DECLARE @days INT ,@everyday AS CHAR(8)
DECLARE @ItemName AS CHAR(100)
INSERT INTO #T1
(
RouteCode ,
RouteName ,
BadItem ,
[01] ,
[02] ,
[03] ,
[04] ,
[05] ,
[06] ,
[07] ,
[08] ,
[09] ,
[10] ,
[11] ,
[12] ,
[13] ,
[14] ,
[15] ,
[16] ,
[17] ,
[18] ,
[19] ,
[20] ,
[21] ,
[22] ,
[23] ,
[24] ,
[25] ,
[26] ,
[27] ,
[28] ,
[29] ,
[30] ,
[31]
)
VALUES ( '0.工序代码' , -- RouteName - char(20)
'0.工序名称' , -- RouteName - char(20)
'产品品名' , -- BadItem - char(20)
'' , -- 01 - char(100)
'' , -- 02 - char(100)
'' , -- 03 - char(100)
'' , -- 04 - char(100)
'' , -- 05 - char(100)
'' , -- 06 - char(100)
'' , -- 07 - char(100)
'' , -- 08 - char(100)
'' , -- 09 - char(100)
'' , -- 10 - char(100)
'' , -- 11 - char(100)
'' , -- 12 - char(100)
'' , -- 13 - char(100)
'' , -- 14 - char(100)
'' , -- 15 - char(100)
'' , -- 16 - char(100)
'' , -- 17 - char(100)
'' , -- 18 - char(100)
'' , -- 19 - char(100)
'' , -- 20 - char(100)
'' , -- 21 - char(100)
'' , -- 22 - char(100)
'' , -- 23 - char(100)
'' , -- 24 - char(100)
'' , -- 25 - char(100)
'' , -- 26 - char(100)
'' , -- 27 - char(100)
'' , -- 28 - char(100)
'' , -- 29 - char(100)
'' , -- 30 - char(100)
'' -- 31 - char(100)
)
SET @days=0
DECLARE @SQL CHAR(200),@2day AS CHAR(2)
--遍历当月每天
while @days<31
BEGIN
SET @days=@days+1
SET @2day=RIGHT(@days+100,2)
SET @everyday=@YearMonth+@2day
--汇总每天产品型号
SELECT @ItemName=STUFF((select '、' + ItemName from R_RouteMaster where CONVERT(CHAR(8),InspectionDate,112)=@everyday FOR XML PATH('')),1,1,'');
--更新每天的产品型号
IF(@ItemName<>'')
BEGIN
SET @SQL='UPDATE #T1 SET ['+@2day+']='''+RTRIM(@ItemName)+''' where BadItem='+'''产品品名'''
--PRINT @SQL
EXECUTE (@SQL)
END
END
--1.实际输出数量
SELECT RouteCode,Route AS RouteName,'1.实际输出数量' AS BadItem,SUM(InspectionQty) InspectionQty,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2) AS eday INTO #T3
FROM dbo.R_RouteDetail LEFT JOIN dbo.R_RouteMaster ON dbo.R_RouteMaster.Id = R_RouteDetail.MasterId
WHERE ProductType=@ProductSeries AND CONVERT(CHAR(6),InspectionDate,112)=@YearMonth AND R_RouteDetail.InspectionQty<>0
GROUP BY RouteCode,Route,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2)
--2.不良数量
SELECT RouteCode,Route AS RouteName,'2.不良数量' AS BadItem,SUM(BadQty) BadQty,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2) AS eday INTO #T4
FROM dbo.R_RouteDetail LEFT JOIN dbo.R_RouteMaster ON dbo.R_RouteMaster.Id = R_RouteDetail.MasterId
WHERE ProductType=@ProductSeries AND CONVERT(CHAR(6),InspectionDate,112)=@YearMonth AND R_RouteDetail.InspectionQty<>0
GROUP BY RouteCode,Route,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2)
--3.不良数量cast(cast(SUM(R_RouteDetail.BadQty)*1.0/SUM(R_RouteDetail.InspectionQty)*100 as decimal(10,2)) as varchar)+'%' AS BadRate
SELECT RouteCode,Route AS RouteName,'3.不良率' AS BadItem, SUM(R_RouteDetail.BadQty)*1.0000/SUM(R_RouteDetail.InspectionQty) BadRate,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2) AS eday INTO #T5
FROM dbo.R_RouteDetail LEFT JOIN dbo.R_RouteMaster ON dbo.R_RouteMaster.Id = R_RouteDetail.MasterId
WHERE ProductType=@ProductSeries AND CONVERT(CHAR(6),InspectionDate,112)=@YearMonth AND R_RouteDetail.InspectionQty<>0
GROUP BY RouteCode,Route,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2)
--4. 直通率先占位默认值
SELECT RouteCode,Route AS RouteName,'4.直通率' AS BadItem,CASE WHEN SUM(R_RouteDetail.InspectionQty) =0 THEN 1 ELSE (SUM(R_RouteDetail.InspectionQty)-SUM(R_RouteDetail.BadQty)*1.0000)/SUM(R_RouteDetail.InspectionQty) END AS ZTRate,
SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2) AS eday INTO #T6
FROM dbo.R_RouteDetail LEFT JOIN dbo.R_RouteMaster ON dbo.R_RouteMaster.Id = R_RouteDetail.MasterId
WHERE ProductType=@ProductSeries AND CONVERT(CHAR(6),InspectionDate,112)=@YearMonth AND R_RouteDetail.InspectionQty<>0
GROUP BY RouteCode,Route,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2)
---不良项目按工序和日期汇总
SELECT R_RouteDetail.RouteCode,R_RouteDetail.Route,InspectionItems AS InspectionItems,SUM(R_RouteInspection.BadQty) AS BadQty ,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2) AS eday INTO #T7
FROM dbo.R_RouteMaster LEFT JOIN dbo.R_RouteDetail ON dbo.R_RouteMaster.Id = R_RouteDetail.MasterId
LEFT JOIN dbo.R_RouteInspection ON R_RouteInspection.DetailId = R_RouteDetail.Id
WHERE ProductType=@ProductSeries AND CONVERT(CHAR(6),InspectionDate,112)=@YearMonth AND R_RouteInspection.BadQty<>0
GROUP BY R_RouteDetail.RouteCode,R_RouteDetail.Route,SUBSTRING(CONVERT(CHAR(8),InspectionDate,112),7,2),InspectionItems
INSERT INTO #T2 SELECT * FROM #T3 /*数据源*/
AS P
PIVOT
(
MAX(InspectionQty) FOR
P.eday IN ([01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
) AS T
INSERT INTO #T2
SELECT * FROM #T4 /*数据源*/
AS P
PIVOT
(
MAX(BadQty) FOR
P.eday/*需要行转列的列*/ IN ([01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
) AS T
INSERT INTO #T2
SELECT * FROM #T5 /*数据源*/
AS P
PIVOT
(
MAX(BadRate) FOR
P.eday/*需要行转列的列*/ IN ([01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
) AS T
INSERT INTO #T2
SELECT * FROM #T6 /*数据源*/
AS P
PIVOT
(
MAX(ZTRate) FOR
P.eday/*需要行转列的列*/ IN ([01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
) AS T
INSERT INTO #T2
SELECT * FROM #T7 /*数据源*/
AS P
PIVOT
(
MAX(BadQty) FOR
P.eday/*需要行转列的列*/ IN ([01],[02],[03],[04],[05],[06],[07],[08],[09],[10],[11],[12],[13],[14],[15],[16],[17],[18],[19],[20],[21],[22],[23],[24],[25],[26],[27],[28],[29],[30],[31])
) AS T
----直通率临时表
SELECT row_number() over(ORDER BY RouteCode,BadItem) AS id ,RouteCode,RouteName,BadItem,
ISNULL([01],1) [01],ISNULL([02],1) [02],ISNULL([03],1) [03],ISNULL([04],1) [04],ISNULL([05],1) [05],ISNULL([06],1) [06],ISNULL([07],1) [07],ISNULL([08],1) [08],
ISNULL([09],1) [09],ISNULL([10],1) [10],ISNULL([11],1) [11],ISNULL([12],1) [12],ISNULL([13],1) [13],ISNULL([14],1) [14],ISNULL([15],1) [15],ISNULL([16],1) [16],
ISNULL([17],1) [17],ISNULL([18],1) [18],ISNULL([19],1) [19],ISNULL([20],1) [20],ISNULL([21],1) [21],ISNULL([22],1) [22],ISNULL([23],1) [23],ISNULL([24],1) [24],
ISNULL([25],1) [25],ISNULL([26],1) [26],ISNULL([27],1) [27],ISNULL([28],1) [28],ISNULL([29],1) [29],ISNULL([30],1) [30],ISNULL([31],1) [31]
INTO #ZT
FROM #T2
WHERE BadItem='4.直通率'
ORDER BY RouteCode, RouteName,BadItem ASC
---更新累积----
UPDATE #T2
SET
#T2.[01]=B.[01],#T2.[02]=B.[02],#T2.[03]=B.[03],#T2.[04]=B.[04],#T2.[05]=B.[05],#T2.[06]=B.[06],#T2.[07]=B.[07],#T2.[08]=B.[08],
#T2.[09]=B.[09],#T2.[10]=B.[10],#T2.[11]=B.[11],#T2.[12]=B.[12],#T2.[13]=B.[13],#T2.[14]=B.[14],#T2.[15]=B.[15],#T2.[16]=B.[16],
#T2.[17]=B.[17],#T2.[18]=B.[18],#T2.[19]=B.[19],#T2.[20]=B.[20],#T2.[21]=B.[21],#T2.[22]=B.[22],#T2.[23]=B.[23],#T2.[24]=B.[24],
#T2.[25]=B.[25],#T2.[26]=B.[26],#T2.[27]=B.[27],#T2.[28]=B.[28],#T2.[29]=B.[29],#T2.[30]=B.[30],#T2.[31]=B.[31]
FROM #T2 INNER JOIN
(
select id,RouteCode,RouteName,BadItem,
EXP(sum(log([01])) over(order by id ASC)) AS [01],
EXP(sum(log([02])) over(order by id ASC)) AS [02],
EXP(sum(log([03])) over(order by id ASC)) AS [03],
EXP(sum(log([04])) over(order by id ASC)) AS [04],
EXP(sum(log([05])) over(order by id ASC)) AS [05],
EXP(sum(log([06])) over(order by id ASC)) AS [06],
EXP(sum(log([07])) over(order by id ASC)) AS [07],
EXP(sum(log([08])) over(order by id ASC)) AS [08],
EXP(sum(log([09])) over(order by id ASC)) AS [09],
EXP(sum(log([10])) over(order by id ASC)) AS [10],
EXP(sum(log([11])) over(order by id ASC)) AS [11],
EXP(sum(log([12])) over(order by id ASC)) AS [12],
EXP(sum(log([13])) over(order by id ASC)) AS [13],
EXP(sum(log([14])) over(order by id ASC)) AS [14],
EXP(sum(log([15])) over(order by id ASC)) AS [15],
EXP(sum(log([16])) over(order by id ASC)) AS [16],
EXP(sum(log([17])) over(order by id ASC)) AS [17],
EXP(sum(log([18])) over(order by id ASC)) AS [18],
EXP(sum(log([19])) over(order by id ASC)) AS [19],
EXP(sum(log([20])) over(order by id ASC)) AS [20],
EXP(sum(log([21])) over(order by id ASC)) AS [21],
EXP(sum(log([22])) over(order by id ASC)) AS [22],
EXP(sum(log([23])) over(order by id ASC)) AS [23],
EXP(sum(log([24])) over(order by id ASC)) AS [24],
EXP(sum(log([25])) over(order by id ASC)) AS [25],
EXP(sum(log([26])) over(order by id ASC)) AS [26],
EXP(sum(log([27])) over(order by id ASC)) AS [27],
EXP(sum(log([28])) over(order by id ASC)) AS [28],
EXP(sum(log([29])) over(order by id ASC)) AS [29],
EXP(sum(log([30])) over(order by id ASC)) AS [30],
EXP(sum(log([31])) over(order by id ASC)) AS [31]
FROM #ZT
) AS B ON #T2.RouteCode=B.RouteCode AND #T2.BadItem=B.BadItem
SELECT * FROM #T1
UNION ALL
SELECT
RouteCode,RouteName,BadItem,
CAST(ISNULL([01],0) AS CHAR(100)) [01],CAST(ISNULL([02],0) AS CHAR(100)) [02],CAST(ISNULL([03],0) AS CHAR(100)) [03],CAST(ISNULL([04],0) AS CHAR(100)) [04],CAST(ISNULL([05],0) AS CHAR(100)) [05],CAST(ISNULL([06],0) AS CHAR(100)) [06],CAST(ISNULL([07],0) AS CHAR(100)) [07],CAST(ISNULL([08],0) AS CHAR(100)) [08],
CAST(ISNULL([09],0) AS CHAR(100)) [09],CAST(ISNULL([10],0) AS CHAR(100)) [10],CAST(ISNULL([11],0) AS CHAR(100)) [11],CAST(ISNULL([12],0) AS CHAR(100)) [12],CAST(ISNULL([13],0) AS CHAR(100)) [13],CAST(ISNULL([14],0) AS CHAR(100)) [14],CAST(ISNULL([15],0) AS CHAR(100)) [15],CAST(ISNULL([16],0) AS CHAR(100)) [16],
CAST(ISNULL([17],0) AS CHAR(100)) [17],CAST(ISNULL([18],0) AS CHAR(100)) [18],CAST(ISNULL([19],0) AS CHAR(100)) [19],CAST(ISNULL([20],0) AS CHAR(100)) [20],CAST(ISNULL([21],0) AS CHAR(100)) [21],CAST(ISNULL([22],0) AS CHAR(100)) [22],CAST(ISNULL([23],0) AS CHAR(100)) [23],CAST(ISNULL([24],0) AS CHAR(100)) [24],
CAST(ISNULL([25],0) AS CHAR(100)) [25],CAST(ISNULL([26],0) AS CHAR(100)) [26],CAST(ISNULL([27],0) AS CHAR(100)) [27],CAST(ISNULL([28],0) AS CHAR(100)) [28],CAST(ISNULL([29],0) AS CHAR(100)) [29],CAST(ISNULL([30],0) AS CHAR(100)) [30],CAST(ISNULL([31],1) AS CHAR(100)) [31]
FROM #T2
ORDER BY RouteCode, RouteName,BadItem ASC
END
效果: