0

我需要關於存儲過程的幫助當涉及到數據庫時,我是一個完整而徹底的noob。我有一個客戶需要修復的程序,它是由另一個開發人員製作的,客戶似乎無法與之聯繫。逆向工程在SQL Server 2000上運行的存儲過程

這個客戶擁有這個程序,並且授予我完整的權利去做任何我喜歡的事情。問題是,這個程序使用水晶報表,並且一個特定的報告給我帶來麻煩,是StockAndSales。此報告從存儲過程填充。但問題是,即使在清空數據庫中的所有表後,報告仍顯示一些不應存在的字段。

該程序是基於.net的應用程序。

對不起,這個noobish後,但我是新來的。

P.S這個程序不是我寫的!

的程序是:

CREATE PROCEDURE GetStockAndSales 
    @StartDate Varchar(10), 
    @EndDate Varchar(10) 
As 
Begin 

SELECT  T1.Item, dbo.Items.Name, T2. NetPPrice, SUM(T1.O) AS O, SUM(T1.P1) AS P1,  SUM(T1.P2) AS P2, SUM(T1.P3) AS P3, SUM(T1.S1) AS S1, SUM(T1.S2) AS S2, SUM(T1.S3) AS S3,SUM(T1.SR1) AS SR1, SUM(T1.SR2) AS SR2, SUM(T1.SR3) AS SR3, SUM(T1.D) AS D 
FROM   (SELECT  Item, SUM(Q) AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   (SELECT  PD.Item, SUM(PD.Quantity) AS Q 
      FROM   Purchase P INNER JOIN 
            PurchaseDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] < @StartDate) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, - (SUM(PD.Quantity)) AS Q 
      FROM   Sales P INNER JOIN 
           SalesDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] < @StartDate) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, SUM(PD.Quantity) AS Q 
      FROM   Sales P INNER JOIN 
           SalesReturns PD ON P.Invoice = PD.Invoice 
      WHERE  (PD.[Date] < @StartDate) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  Item, - (SUM(Quantity)) AS Q 
      FROM   Damage D 
      WHERE  ([Date] < @StartDate) 
      GROUP BY Item) T 
      GROUP BY Item 
      UNION ALL 
      SELECT  PD.Item, 0 AS O, SUM(PD.Quantity) AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.Purchase P INNER JOIN 
           dbo.PurchaseDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] BETWEEN @StartDate And @EndDate) AND (P.Company = 1) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, 0 AS O, 0 AS P1, SUM(PD.Quantity) AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.Purchase P INNER JOIN 
           dbo.PurchaseDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] BETWEEN @StartDate And @EndDate) AND (P.Company = 2) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, 0 AS O, 0 AS P1, 0 AS P2, SUM(PD.Quantity) AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.Purchase P INNER JOIN 
           dbo.PurchaseDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] BETWEEN @StartDate And @EndDate) AND (P.Company = 3) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, SUM(PD.Quantity) AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.Sales P INNER JOIN 
           dbo.SalesDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] BETWEEN @StartDate And @EndDate) AND (P.Company = 1) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, SUM(PD.Quantity) AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.Sales P INNER JOIN 
           dbo.SalesDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] BETWEEN @StartDate And @EndDate) AND (P.Company = 2) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  PD.Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, SUM(PD.Quantity) AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.Sales P INNER JOIN 
           dbo.SalesDetails PD ON P.Invoice = PD.Invoice 
      WHERE  (P.[Date] BETWEEN @StartDate And @EndDate) AND (P.Company = 3) 
      GROUP BY PD.Item 
      UNION ALL 
      SELECT  dbo.SalesReturns.Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, SUM(dbo.SalesReturns.Quantity) AS SR1, 0 AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.SalesReturns INNER JOIN 
           dbo.Sales ON dbo.SalesReturns.Invoice = dbo.Sales.Invoice 
      WHERE  (dbo.SalesReturns.[Date] BETWEEN @StartDate And @EndDate) AND (dbo.Sales.Company = 1) 
      GROUP BY dbo.SalesReturns.Item 
      UNION ALL 
      SELECT  dbo.SalesReturns.Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, SUM(dbo.SalesReturns.Quantity) AS SR2, 0 AS SR3, 0 AS D 
      FROM   dbo.SalesReturns INNER JOIN 
           dbo.Sales ON dbo.SalesReturns.Invoice = dbo.Sales.Invoice 
      WHERE  (dbo.SalesReturns.[Date] BETWEEN @StartDate And @EndDate) AND (dbo.Sales.Company = 2) 
      GROUP BY dbo.SalesReturns.Item 
      UNION ALL 
      SELECT  dbo.SalesReturns.Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, SUM(dbo.SalesReturns.Quantity) AS SR3, 0 AS D 
      FROM   dbo.SalesReturns INNER JOIN 
           dbo.Sales ON dbo.SalesReturns.Invoice = dbo.Sales.Invoice 
      WHERE  (dbo.SalesReturns.[Date] BETWEEN @StartDate And @EndDate) AND (dbo.Sales.Company = 3) 
      GROUP BY dbo.SalesReturns.Item 
      UNION ALL 
      SELECT  Item, 0 AS O, 0 AS P1, 0 AS P2, 0 AS P3, 0 AS S1, 0 AS S2, 0 AS S3, 0 AS SR1, 0 AS SR2, 0 AS SR3, SUM(Quantity) AS D 
      FROM   dbo.Damage 
      WHERE  ([Date] BETWEEN @StartDate And @EndDate) 
      GROUP BY Item) T1 INNER JOIN 
      dbo.Items ON T1.Item = dbo.Items.Code INNER JOIN (SELECT  Code, Name, SUM(CASE WHEN NETPPRICE <> 0 THEN NETPPRICE ELSE 0 END) AS NetPPrice, 
      SUM(CASE WHEN NETSPRICE <> 0 THEN NETSPRICE ELSE 0 END) AS NetSPrice, SUM(CASE WHEN Diff <> 0 THEN Diff ELSE 0 END) 
      AS Difference 
      FROM   (SELECT  TOP 100 PERCENT dbo.Items.Code, dbo.Items.Name, V1.NetPPrice, V2.NetSPrice, ROUND(V2.NetSPrice - V1.NetPPrice, 2) AS Diff 
      FROM   dbo.Items LEFT OUTER JOIN 
      (SELECT  Item, ROUND(NetPPrice, 2) AS NetPPrice 
      FROM   (SELECT  Item, AVG([Value]/Units) AS NetPPrice 
      FROM   (SELECT  dbo.PurchaseDetails.Item, SUM(dbo.PurchaseDetails.Quantity * dbo.PurchaseDetails.Price) AS Value, 
     SUM(dbo.PurchaseDetails.Quantity) AS Units 
      FROM   dbo.Purchase INNER JOIN 
     dbo.PurchaseDetails ON dbo.Purchase.Invoice = dbo.PurchaseDetails.Invoice 
      GROUP BY dbo.Purchase.[Date], dbo.PurchaseDetails.Item 
      HAVING  (dbo.Purchase.[Date] <= GETDATE()) AND SUM(dbo.PurchaseDetails.Quantity)<>0) T 
      GROUP BY Item) T1) V1 ON dbo.Items.Code = V1.Item LEFT OUTER JOIN 
      (SELECT  Item, ROUND(NetSPrice, 2) AS NetSPrice 
      FROM   (SELECT  Item, AVG([Value]/Units) AS NetSPrice 
      FROM   (SELECT  dbo.SalesDetails.Item, 
     SUM(dbo.SalesDetails.Quantity * (dbo.SalesDetails.Price - dbo.SalesDetails.Discount)) AS Value, 
     SUM(dbo.SalesDetails.Quantity) AS Units 
      FROM   dbo.Sales INNER JOIN 
     dbo.SalesDetails ON dbo.Sales.Invoice = dbo.SalesDetails.Invoice 
      GROUP BY dbo.Sales.[Date], dbo.SalesDetails.Item 
            HAVING  (dbo.Sales.[Date] <= GETDATE())) T 
      GROUP BY Item) T1) V2 ON dbo.Items.Code = V2.Item) G 
      GROUP BY Code, Name 
     ) T2 ON T1.Item = T2.Code 
      GROUP BY T1.Item, dbo.Items.Name, T2. NetPPrice 
      ORDER BY dbo.Items.Name 
End 
GO 
+0

感謝@marc_s進行了許多有趣的編輯和註釋。 – MoniXx

回答

0

您已經計算出從存儲過程返回的字段。 第一個SELECT語句中的所有SUM()字段

SUM(T1.O) AS O, SUM(T1.P1) AS P1,  SUM(T1.P2) AS P2, SUM(T1.P3) AS P3,....... 
+0

以及這些'T1和'P2是什麼? – MoniXx

+0

它們是內部子查詢的別名 –