Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 从SQL Server表计算销售额、退款和损坏_Sql Server 2005_Sql_C#_Tsql - Fatal编程技术网

Sql server 2005 从SQL Server表计算销售额、退款和损坏

Sql server 2005 从SQL Server表计算销售额、退款和损坏,sql-server-2005,sql,c#,tsql,Sql Server 2005,Sql,C#,Tsql,我有4张表,分别是Products、SalesLog、Breakages和SalesReturn 产品表 销售记录表 销售退货表 破损表 我必须根据SalesLOg、Breakages和SalesReturn的BillDate列,以以下模式生成一个报告来显示特定日期的SalesLOg、SalesReturn和Breakages 想要的产出 为了便于阅读,减少了输出列 正如你所看到的,由于A产品的价格变化,A产品已经上市两次。为此,我编写了一个查询: SELECT SalesLog.pNa

我有4张表,分别是Products、SalesLog、Breakages和SalesReturn

产品表

销售记录表

销售退货表

破损表

我必须根据SalesLOg、Breakages和SalesReturn的BillDate列,以以下模式生成一个报告来显示特定日期的SalesLOg、SalesReturn和Breakages

想要的产出

为了便于阅读,减少了输出列

正如你所看到的,由于A产品的价格变化,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查询或逻辑都将有助于


谢谢你带我………

试试这样的东西:

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表中存储了完整的价格变化历史记录-如果Products上只存储了最新的价格,则需要删除Products.pPrice=Sales\u Trans.price连接条件。

thank you@Mark Bannister,我不知道您是如何帮助我的。此查询正在执行我想要的操作。非常感谢。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
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]
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
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