2010-07-18 5 views
0

J'ai 4 tables à savoir Products, SalesLog, Breakages, SalesReturn.calculer les ventes, les remboursements et les ruptures à partir des tables SQL Server

Produits Tableau

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 Tableau

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 Tableau

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] 

Ruptures Tableau

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] 

Je dois générer un seul rapport pour montrer SalesLOg, SalesReturn et Ruptures de date particulière (selon la colonne BillDate de SalesLog, et Ruptures SalesReturn) en suivant modèle.

sortie Recherché

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 

colonne de sortie réduite pour le bien de lire

que vous pouvez voir que le produit « A » a été répertorié deux fois à cause du changement de prix de ce produit. pour y parvenir, je l'ai écrit une requête:

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 

Mon problème avec cette requête est, il ne peut pas afficher les entrées d'articles où il n'y a pas de ventes mais il y a le retour des ventes. cette condition est donnée par mon client. Pouvez-vous m'aider à ce sujet. toute requête t-sql ou logique pour mettre en œuvre cette condition vous aidera ...

vous remercie de me portant .........

Répondre

1

Essayez quelque chose comme ceci:

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 

(Cela suppose qu'un historique complet des changements de prix est stocké dans la table Products - si seuls les derniers prix sont stockés sur Products, la condition de jointure Products.pPrice = Sales_Trans.Price devra être supprimée.)

+0

merci @ Mark Bannister, je ne peux pas dire comment vous m'avez aidé. Cette requête fait ce que je voulais. Merci beaucoup .......................................... –

+0

Je suis content aidé. :) –

Questions connexes