расчет продаж, возмещения и поломок из таблиц SQL Server - PullRequest
0 голосов
/ 18 июля 2010

У меня есть 4 таблицы, а именно Products, SalesLog, Breakages, SalesReturn.

Таблица продуктов

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]

Таблица SalesLog

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]

Таблица SalesReturn

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 определенной даты (согласно столбцу BillDate SalesLog, Breakages и SalesReturn) по следующей схеме.

Wanted Output

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

Сокращенов столбце вывода указано значение

, поскольку видно, что Товар "А" был указан дважды из-за изменения цены этого товара.Чтобы достичь этого, я написал запрос:

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 Ответ

1 голос
/ 19 июля 2010

Попробуйте что-то вроде этого:

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 необходимо удалить.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...