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

它们是内部子查询的别名 –