代码之家  ›  专栏  ›  技术社区  ›  Raj

从SQL Server表计算销售、退款和破损

  •  0
  • Raj  · 技术社区  · 14 年前

    我有4张表,分别是产品、销售日志、破损、销售退货。

    乘积表

    CREATE TABLE [dbo].[Products](
    [ProductId] [int] IDENTITY(1,1) NOT NULL,
    [pName] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [pSize] [int] NULL,
    [pPrice] [decimal](10, 2) NULL,
    [pPackQty] [int] NULL,
    [pGroup] [int] NULL,
    [pCode] [int] NULL,
    [OpenStock] [int] NULL,
    [CloseStock] [int] NULL,
    [YrlyOpenStock] [int] NULL,
    CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED 
    (
    [ProductId] ASC
    )WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    

    销售日志表

    CREATE TABLE [dbo].[SalesLog](
    [SalesID] [int] IDENTITY(1,1) NOT NULL,
    [MemoNo] [int] NULL,
    [ProductCode] [int] NULL,
    [Quantity] [int] NULL,
    [Price] [decimal](10, 2) NULL,
    [pGroup] [int] NULL,
    [pName] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [pSize] [int] NULL,
    [BillDate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    CONSTRAINT [PK_SalesLog] PRIMARY KEY CLUSTERED 
    (
    [SalesID] ASC
    )WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    

    销售退回表

    CREATE TABLE [dbo].[SalesReturn](
    [srID] [int] IDENTITY(1,1) NOT NULL,
    [ProductCode] [int] NULL,
    [Quantity] [int] NULL,
    [pGroup] [int] NULL,
    [MemoNo] [int] NULL,
    [SalesmanID] [int] NULL,
    [Price] [decimal](10, 2) NULL,
    [JobShift] [int] NULL,
    [BillDate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [AddedOn] [datetime] NULL,
     CONSTRAINT [PK_SalesReturn] PRIMARY KEY CLUSTERED 
    (
    [srID] ASC
    )WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    

    破损表

    CREATE TABLE [dbo].[Breakages](
    [breakId] [int] IDENTITY(1,1) NOT NULL,
    [MemoNo] [int] NULL,
    [SalesmanID] [int] NULL,
    [ProductCode] [int] NULL,
    [pName] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [Quantity] [int] NULL,
    [Price] [decimal](10, 2) NULL,
    [pGroup] [int] NULL,
    [JobShift] [int] NULL,
    [BillDate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
    [AddedOn] [datetime] NULL,
    CONSTRAINT [PK_Breakages_1] PRIMARY KEY CLUSTERED 
    (
    [breakId] ASC
    )WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
    ) ON [PRIMARY]
    

    我必须生成一个单独的报告,以按照以下模式显示特定日期的saleslog、salesreturn和breakages(根据saleslog、breakages和salesreturn的billdate列)。

    通缉输出

    Code      ItemName     Price     SalesQty     BreakagesQty    SalesReturnQty
     1           A          $10         50              2               2
     1           A          $12         150             1               10
     15          X          $5          56              0               2
     20          Z          $8          121             0               0
    

    减少输出列以便读取

    正如您所看到的,由于该产品的价格变化,该产品“A”已被列出两次。为此,我编写了一个查询:

    SELECT     SalesLog.pName, SalesLog.ProductCode, MIN(ItemGroup.gName) AS GroupName, 
               SalesLog.Price, SUM    (SalesLog.Quantity) AS SalesQty, 
               SUM(SalesLog.Quantity * SalesLog.Price) AS SalesValue, 
         ISNULL ((SELECT     SUM(Quantity) AS Expr1 FROM Breakages
            WHERE (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
              (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS BreakQty, 
         ISNULL ((SELECT     SUM(Quantity * Price) AS Expr1
     FROM         Breakages
            WHERE     (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
              (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS BreakValue, 
         ISNULL ((SELECT     SUM(Quantity) AS Expr1
     FROM         SalesReturn
           WHERE     (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
              (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS ReturnQty, 
         ISNULL ((SELECT     SUM(Quantity * Price) AS Expr1
     FROM         SalesReturn
           WHERE     (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
              (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS ReturnValue, 
         ISNULL ((SELECT     SUM(Quantity) AS Expr1
     FROM         SalesLog
           WHERE     (ProductCode = Products.pCode)), 0) AS CummSales
     FROM         SalesLog 
              INNER JOIN
                  ItemGroup ON ItemGroup.gCode = SalesLog.pGroup AND SalesLog.pGroup = ItemGroup.gCode 
              INNER JOIN
                  Products ON Products.pCode = SalesLog.ProductCode
           WHERE  (SalesLog.BillDate = '07/01/2010') AND (SalesLog.pGroup <> 15) AND 
                  (SalesLog.pGroup <> 16)
    GROUP BY SalesLog.pName, SalesLog.ProductCode, SalesLog.Price, Products.pCode, Products.pPrice
    ORDER BY SalesLog.ProductCode, SalesLog.pName
    

    我对这个查询的问题是,它无法显示没有销售但有销售退回的项目的条目。这个条件是由我的客户提供的。你能帮我一下吗?实现此条件的任何T-SQL查询或逻辑都将有助于…

    谢谢你照顾我……

    1 回复  |  直到 14 年前
        1
  •  1
  •   user359040    14 年前

    尝试如下操作:

    SELECT  MIN(Products.pName) AS pName,
            Products.pCode AS ProductCode,
            MIN(Products.pGroup) AS GroupName, 
            Sales_Trans.Price,
            SUM(Sales_Trans.Sales_Qty) AS SalesQty, 
            SUM(Sales_Trans.Sales_Value) AS SalesValue, 
            SUM(Sales_Trans.Break_Qty) AS BreakQty, 
            SUM(Sales_Trans.Break_Value) AS BreakValue, 
            SUM(Sales_Trans.Return_Qty) AS ReturnQty, 
            SUM(Sales_Trans.Return_Value) AS ReturnValue, 
    FROM Products
    JOIN        
    (SELECT ProductCode, Price, Quantity Sales_Qty, Price * Quantity Sales_Value, 0 Break_Qty, 0 Break_Value, 0 Return_Qty, 0 Return_Value FROM SalesLog
     WHERE  (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)
     UNION ALL
     SELECT ProductCode, Price, 0 Sales_Qty, 0 Sales_Value, 0 Break_Qty, 0 Break_Value, Quantity Return_Qty, Price * Quantity Return_Value FROM SalesReturn
     WHERE  (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)
     UNION ALL
     SELECT ProductCode, Price, 0 Sales_Qty, 0 Sales_Value, Quantity Break_Qty, Price * Quantity Break_Value, 0 Return_Qty, 0 Return_Value FROM Breakages
     WHERE  (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)
    ) Sales_Trans
    ON (Products.pCode = Sales_Trans.ProductCode) and (Products.pPrice = Sales_Trans.Price)
    GROUP BY Products.pCode, Sales_Trans.Price
    ORDER BY 2,1
    

    (这假设价格变化的完整历史记录存储在“产品”表中-如果只存储产品上的最新价格,则需要删除products.pprice=sales_trans.price联接条件。)