2013-12-14 26 views
0

我在SQL Server中有一個包含機車故障約兩年的表。我正在嘗試創建一個aspx頁面,用於比較兩個不同時期的上述數據,例如%年齡改善/惡化,每月,每年或基於用戶輸入。從SQL Server中單表數據的兩個不同時期的比較分析

表結構(PunctualityMain)爲:

ID Date Loco No. Shed Classification loco_type Equipt 

我已創建使用兩個樞軸,一個用於進行比較的數據(C =電流),另一個用於先前的數據(P =前一個)

下面的存儲過程
ALTER PROCEDURE [dbo].[Comparative] 
    @pstrdt datetime, 
    @penddt datetime, 
    @cstrdt datetime, 
    @cenddt datetime, 
    @loco_type nvarchar(255)  
AS 
BEGIN 
    CREATE TABLE #previousdata (Equipt nvarchar(255), BSLP numeric(18,0), AQP numeric(18,0), KYNP numeric(18,0), ASNP numeric(18,0), HWHP numeric(18,0), MGSP numeric(18,0), GMOP numeric(18,0), WATP numeric(18,0), ANGLP numeric(18,0), GZBP numeric(18,0), LDHP numeric(18,0), JHSP numeric(18,0), CNBP numeric(18,0), AJJP numeric(18,0), EDP numeric(18,0), RPMP numeric(18,0), BZAP numeric(18,0), LGDP numeric(18,0), KZJP numeric(18,0), TATAP numeric(18,0), BNDMP numeric(18,0), BKSCP numeric(18,0), SRCP numeric(18,0), BIAP numeric(18,0), BRCP numeric(18,0), BLP numeric(18,0), TKDP numeric(18,0), ETP numeric(18,0), NKJP numeric(18,0)) 
    CREATE TABLE #currentdata (Equipt nvarchar(255), BSLC numeric(18,0), AQC numeric(18,0), KYNC numeric(18,0), ASNC numeric(18,0), HWHC numeric(18,0), MGSC numeric(18,0), GMOC numeric(18,0), WATC numeric(18,0), ANGLC numeric(18,0), GZBC numeric(18,0), LDHC numeric(18,0), JHSC numeric(18,0), CNBC numeric(18,0), AJJC numeric(18,0), EDC numeric(18,0), RPMC numeric(18,0), BZAC numeric(18,0), LGDC numeric(18,0), KZJC numeric(18,0), TATAC numeric(18,0), BNDMC numeric(18,0), BKSCC numeric(18,0), SRCC numeric(18,0), BIAC numeric(18,0), BRCC numeric(18,0), BLC numeric(18,0), TKDC numeric(18,0), ETC numeric(18,0), NKJC numeric(18,0)) 

INSERT INTO #previousdata SELECT Equipt, [BSL] AS BSLP, [AQ] AS AQP, [KYN] AS KYNP, [ASN] AS ASNP, [HWH] AS HWHP, [MGS] AS MGSP, [GMO] AS GMOP, [WAT] AS WATP, [ANGL] AS ANGLP, [GZB] AS GZBP, [LDH] AS LDHP, [JHS] AS JHSP, [CNB] AS CNBP, [AJJ] AS AJJP, [ED] AS EDP, [RPM] AS RPMP, [BZA] AS BZAP, [LGD] AS LGDP, [KZJ] AS KZJP, [TATA] AS TATAP, [BNDM] AS BNDMP, [BKSC] AS BKSCP, [SRC] AS SRCP, [BIA] AS BIAP, [BRC] AS BRCP, [BL] AS BLP, [TKD] AS TKDP, [ET] AS ETP, [NKJ] AS NKJP 
FROM 
( 
SELECT Equipt, Shed 
FROM PunctualityMain WHERE classification = 'Loco' AND (loco_type = @loco_type OR @loco_type IS NULL) AND (Date >= @pstrdt OR @pstrdt IS NULL) AND (Date <= @penddt OR @penddt IS NULL) 
) x 
PIVOT 
( 
COUNT(Shed) 
FOR Shed IN ([BSL], [AQ], [KYN], [ASN], [HWH], [MGS], [GMO], [WAT], [ANGL], [GZB], [LDH], [JHS], [CNB], [AJJ], [ED], [RPM], [BZA], [LGD], [KZJ], [TATA], [BNDM], [BKSC], [SRC], [BIA], [BRC], [BL], [TKD], [ET], [NKJ])) p 

INSERT INTO #currentdata SELECT Equipt, [BSL] AS BSLC, [AQ] AS AQC, [KYN] AS KYNC, [ASN] AS ASNC, [HWH] AS HWHC, [MGS] AS MGSC, [GMO] AS GMOC, [WAT] AS WATC, [ANGL] AS ANGLC, [GZB] AS GZBC, [LDH] AS LDHC, [JHS] AS JHSC, [CNB] AS CNBC, [AJJ] AS AJJC, [ED] AS EDC, [RPM] AS RPMC, [BZA] AS BZAC, [LGD] AS LGDC, [KZJ] AS KZJC, [TATA] AS TATAC, [BNDM] AS BNDMC, [BKSC] AS BKSCC, [SRC] AS SRCC, [BIA] AS BIAC, [BRC] AS BRCC, [BL] AS BLC, [TKD] AS TKDC, [ET] AS ETC, [NKJ] AS NKJC 
FROM 
( 
SELECT Equipt, Shed 
FROM PunctualityMain WHERE classification = 'Loco' AND (loco_type = @loco_type OR @loco_type IS NULL) AND (Date >= @cstrdt OR @cstrdt IS NULL) AND (Date <= @cenddt OR @cenddt IS NULL) 
) x 
PIVOT 
( 
COUNT(Shed) 
FOR Shed IN ([BSL], [AQ], [KYN], [ASN], [HWH], [MGS], [GMO], [WAT], [ANGL], [GZB], [LDH], [JHS], [CNB], [AJJ], [ED], [RPM], [BZA], [LGD], [KZJ], [TATA], [BNDM], [BKSC], [SRC], [BIA], [BRC], [BL], [TKD], [ET], [NKJ])) p 


SELECT 
COALESCE(t1.Equipt, t2.Equipt) Equipt, NULLIF(BSLP,0) AS 'BSLP', NULLIF(BSLC,0) AS 'BSLC', CAST(((BSLP-BSLC)/NULLIF(BSLP,0)*100) AS DECIMAL (10,2))AS 'BSL_I_D', NULLIF(AQP,0) AS 'AQP', NULLIF(AQC,0) AS 'AQC', CAST(((AQP-AQC)/NULLIF(AQP,0)*100) AS DECIMAL (10,2))AS 'AQ_I_D', NULLIF(KYNP,0) AS 'KYNP', NULLIF(KYNC,0) AS 'KYNC', CAST(((KYNP-KYNC)/NULLIF(KYNP,0)*100) AS DECIMAL (10,2))AS 'KYN_I_D', NULLIF(ASNP,0) AS 'ASNP', NULLIF(ASNC,0) AS 'ASNC', CAST(((ASNP-ASNC)/NULLIF(ASNP,0)*100) AS DECIMAL (10,2))AS 'ASN_I_D', NULLIF(HWHP,0) AS 'HWHP', NULLIF(HWHC,0) AS 'HWHC', CAST(((HWHP-HWHC)/NULLIF(HWHP,0)*100) AS DECIMAL (10,2))AS 'HWH_I_D', NULLIF(MGSP,0) AS 'MGSP', NULLIF(MGSC,0) AS 'MGSC', CAST(((MGSP-MGSC)/NULLIF(MGSP,0)*100) AS DECIMAL (10,2))AS 'MGS_I_D', NULLIF(GMOP,0) AS 'GMOP', NULLIF(GMOC,0) AS 'GMOC', CAST(((GMOP-GMOC)/NULLIF(GMOP,0)*100) AS DECIMAL (10,2))AS 'GMO_I_D', NULLIF(WATP,0) AS 'WATP', NULLIF(WATC,0) AS 'WATC', CAST(((WATP-WATC)/NULLIF(WATP,0)*100) AS DECIMAL (10,2))AS 'WAT_I_D', NULLIF(ANGLP,0) AS 'ANGLP', NULLIF(ANGLC,0) AS 'ANGLC', CAST(((ANGLP-ANGLC)/NULLIF(ANGLP,0)*100) AS DECIMAL (10,2))AS 'ANGL_I_D', NULLIF(GZBP,0) AS 'GZBP', NULLIF(GZBC,0) AS 'GZBC', CAST(((GZBP-GZBC)/NULLIF(GZBP,0)*100) AS DECIMAL (10,2))AS 'GZB_I_D', NULLIF(LDHP,0) AS 'LDHP', NULLIF(LDHC,0) AS 'LDHC', CAST(((LDHP-LDHC)/NULLIF(LDHP,0)*100) AS DECIMAL (10,2))AS 'LDH_I_D', NULLIF(JHSP,0) AS 'JHSP', NULLIF(JHSC,0) AS 'JHSC', CAST(((JHSP-JHSC)/NULLIF(JHSP,0)*100) AS DECIMAL (10,2))AS 'JHS_I_D', NULLIF(CNBP,0) AS 'CNBP', NULLIF(CNBC,0) AS 'CNBC', CAST(((CNBP-CNBC)/NULLIF(CNBP,0)*100) AS DECIMAL (10,2))AS 'CNB_I_D', NULLIF(AJJP,0) AS 'AJJP', NULLIF(AJJC,0) AS 'AJJC', CAST(((AJJP-AJJC)/NULLIF(AJJP,0)*100) AS DECIMAL (10,2))AS 'AJJ_I_D', NULLIF(EDP,0) AS 'EDP', NULLIF(EDC,0) AS 'EDC', CAST(((EDP-EDC)/NULLIF(EDP,0)*100) AS DECIMAL (10,2))AS 'ED_I_D', NULLIF(RPMP,0) AS 'RPMP', NULLIF(RPMC,0) AS 'RPMC', CAST(((RPMP-RPMC)/NULLIF(RPMP,0)*100) AS DECIMAL (10,2))AS 'RPM_I_D', NULLIF(BZAP,0) AS 'BZAP', NULLIF(BZAC,0) AS 'BZAC', CAST(((BZAP-BZAC)/NULLIF(BZAP,0)*100) AS DECIMAL (10,2))AS 'BZA_I_D', NULLIF(LGDP,0) AS 'LGDP', NULLIF(LGDC,0) AS 'LGDC', CAST(((LGDP-LGDC)/NULLIF(LGDP,0)*100) AS DECIMAL (10,2))AS 'LGD_I_D', NULLIF(KZJP,0) AS 'KZJP', NULLIF(KZJC,0) AS 'KZJC', CAST(((KZJP-KZJC)/NULLIF(KZJP,0)*100) AS DECIMAL (10,2))AS 'KZJ_I_D', NULLIF(TATAP,0) AS 'TATAP', NULLIF(TATAC,0) AS 'TATAC', CAST(((TATAP-TATAC)/NULLIF(TATAP,0)*100) AS DECIMAL (10,2))AS 'TATA_I_D', NULLIF(BNDMP,0) AS 'BNDMP', NULLIF(BNDMC,0) AS 'BNDMC', CAST(((BNDMP-BNDMC)/NULLIF(BNDMP,0)*100) AS DECIMAL (10,2))AS 'BNDM_I_D', NULLIF(BKSCP,0) AS 'BKSCP', NULLIF(BKSCC,0) AS 'BKSCC', CAST(((BKSCP-BKSCC)/NULLIF(BKSCP,0)*100) AS DECIMAL (10,2))AS 'BKSC_I_D', NULLIF(SRCP,0) AS 'SRCP', NULLIF(SRCC,0) AS 'SRCC', CAST(((SRCP-SRCC)/NULLIF(SRCP,0)*100) AS DECIMAL (10,2))AS 'SRC_I_D', NULLIF(BIAP,0) AS 'BIAP', NULLIF(BIAC,0) AS 'BIAC', CAST(((BIAP-BIAC)/NULLIF(BIAP,0)*100) AS DECIMAL (10,2))AS 'BIA_I_D', NULLIF(BRCP,0) AS 'BRCP', NULLIF(BRCC,0) AS 'BRCC', CAST(((BRCP-BRCC)/NULLIF(BRCP,0)*100) AS DECIMAL (10,2))AS 'BRC_I_D', NULLIF(BLP,0) AS 'BLP', NULLIF(BLC,0) AS 'BLC', CAST(((BLP-BLC)/NULLIF(BLP,0)*100) AS DECIMAL (10,2))AS 'BL_I_D', NULLIF(TKDP,0) AS 'TKDP', NULLIF(TKDC,0) AS 'TKDC', CAST(((TKDP-TKDC)/NULLIF(TKDP,0)*100) AS DECIMAL (10,2))AS 'TKD_I_D', NULLIF(ETP,0) AS 'ETP', NULLIF(ETC,0) AS 'ETC', CAST(((ETP-ETC)/NULLIF(ETP,0)*100) AS DECIMAL (10,2))AS 'ET_I_D', NULLIF(NKJP,0) AS 'NKJP', NULLIF(NKJC,0) AS 'NKJC', CAST(((NKJP-NKJC)/NULLIF(NKJP,0)*100) AS DECIMAL (10,2))AS 'NKJ_I_D', ([BSLP] + [AQP] + [KYNP] + [ASNP] + [HWHP] + [MGSP] + [GMOP] + [WATP] + [ANGLP] + [GZBP] + [LDHP] + [JHSP] + [CNBP] + [AJJP] + [EDP] + [RPMP] + [BZAP] + [LGDP] + [KZJP] + [TATAP] + [BNDMP] + [BKSCP] + [SRCP] + [BIAP] + [BRCP] + [BLP] + [TKDP] + [ETP] + [NKJP]) AS 'TTL_P', ([BSLC] + [AQC] + [KYNC] + [ASNC] + [HWHC] + [MGSC] + [GMOC] + [WATC] + [ANGLC] + [GZBC] + [LDHC] + [JHSC] + [CNBC] + [AJJC] + [EDC] + [RPMC] + [BZAC] + [LGDC] + [KZJC] + [TATAC] + [BNDMC] + [BKSCC] + [SRCC] + [BIAC] + [BRCC] + [BLC] + [TKDC] + [ETC] + [NKJC]) AS 'TTL_C', CAST(((([BSLP] + [AQP] + [KYNP] + [ASNP] + [HWHP] + [MGSP] + [GMOP] + [WATP] + [ANGLP] + [GZBP] + [LDHP] + [JHSP] + [CNBP] + [AJJP] + [EDP] + [RPMP] + [BZAP] + [LGDP] + [KZJP] + [TATAP] + [BNDMP] + [BKSCP] + [SRCP] + [BIAP] + [BRCP] + [BLP] + [TKDP] + [ETP] + [NKJP])-([BSLC] + [AQC] + [KYNC] + [ASNC] + [HWHC] + [MGSC] + [GMOC] + [WATC] + [ANGLC] + [GZBC] + [LDHC] + [JHSC] + [CNBC] + [AJJC] + [EDC] + [RPMC] + [BZAC] + [LGDC] + [KZJC] + [TATAC] + [BNDMC] + [BKSCC] + [SRCC] + [BIAC] + [BRCC] + [BLC] + [TKDC] + [ETC] + [NKJC]))/(([BSLP] + [AQP] + [KYNP] + [ASNP] + [HWHP] + [MGSP] + [GMOP] + [WATP] + [ANGLP] + [GZBP] + [LDHP] + [JHSP] + [CNBP] + [AJJP] + [EDP] + [RPMP] + [BZAP] + [LGDP] + [KZJP] + [TATAP] + [BNDMP] + [BKSCP] + [SRCP] + [BIAP] + [BRCP] + [BLP] + [TKDP] + [ETP] + [NKJP]))*100) AS DECIMAL (10,2))AS 'TTL_I_D' 


FROM #currentdata t1 
    FULL JOIN #previousdata t2 ON t1.Equipt = t2.Equipt 

End 

它給我造成的

Equipt BSLP BSLC BSL_I_D AQP AQC  AQ_I_D .............. 
    TM  4  5  -25.00  8 6  25.00 
VCD  1   100.00   1  
    DJ  7  2  71.42  12 28  -133.33 

以上實現方法具如果設備在當前期間或在任何一個棚屋內至少有一次跌落,d工作正常。但是,如果設備不在當前時期,這並沒有顯示出任何改善。爲什麼?。有沒有辦法做同樣的事情?或者如何克服目前程序中的這種情況?

問題可以下列連結,改善列是保持空白設備「空爆斷路器(DJ)」 http://elocos.railnet.gov.in/Punctuality/comparative.aspx

回答

1

原因是在這個表達式中看到:

CAST(((AQP-AQC)/NULLIF(AQP,0)*100) AS DECIMAL (10,2)) 

當AQC其結果是NULL也是NULL。順便說一句,如果AQP是NULL,你會得到相同的結果。

如果您使用FULL JOIN,則需要保護NULL值的結果,因爲它們在您的情況下具有0的含義。因此,在您的SELECT聲明中隨處可以使用COALESCE(ColX, 0)

UPDATE

下面是例如使用COALESCE()的:

INSERT INTO #previousdata 
    SELECT Equipt, COALESCE([BSL], 0) AS BSLP, COALESCE([AQ], 0) AS AQP, 
. . . 
+0

對不起,我無法理解使用COALESCE(ColX,0)以及在哪裏放置這個&How。如果可能,請爲我寫一些代碼。謝謝 – Sunil

+0

@Sunil:對不起,我不確定。我添加更新到我的答案,我希望能回答你的問題。 – Serg

+0

非常感謝您的先生。 – Sunil

0

以下修改也可以被用於解決問題上述

所討論
CAST(((BSLP-(CASE when BSLC IS NULL then 0 else BSLC end))/NULLIF(BSLP,0)*100) AS DECIMAL (10,2))AS 'BSL_I_D'