sql - 按每笔销售显示库存详细信息

标签 sql sql-server sql-server-2012

我试图通过将数据与每个客户、销售分组来从 ProdcutStock 表中选择数据。

我的表格如下

销售大师

Id  CustId  TDate
1   2       2016-06-03
2   1       2016-06-03
3   2       2016-06-06
4   2       2016-06-06
5   1       2016-06-06
6   3       2016-06-06

销售详情

Id  SalesId ProductId   Qty
1   1       2       4.00
2   1       1       5.00
3   2       2       21.00
4   2       2       88.00
5   2       1       8.00
6   2       3       9.00
7   2       3       4.00
8   2       1       77.00
9   2       2       4.00
10  2       3       8.00
11  2       2       7.00
12  3       2       41.00
13  3       3       10.00
14  4       2       25.00
15  4       1       49.00
16  5       3       50.00
17  5       1       50.00
18  6       2       10.00
19  6       3       20.00

产品库存

Id  Date    OpeningStock    TotalProduction TotalSales  ClosingStock
1   2016-06-05  100.00      0.00            0.00        100.00
2   2016-06-06  100.00      325.00          255.00      170.00
3   2016-06-07  200.00      0.00            0.00        200.00
5   2016-06-08  200.00      0.00            0.00        200.00
6   2016-06-09  200.00      0.00            0.00        200.00
7   2016-06-10  200.00      0.00            0.00        200.00

我想要实现的是下表

Date    OpeningStock    Production  Sales   Customer    ClosingStock
2016-06-05  100.00      0.00        0.00    NULL        100.00
2016-06-06  100.00      325.00      125.00  XYZ         300.00
2016-06-06  300.00      0.00        30.00   ABC         270.00
2016-06-06  270.00      0.00        100.00  PQR         170.00
2016-06-07  170.00      0.00        0.00    NULL        200.00

我使用下面的代码得到了什么:(查看开仓和平仓股票)

Date    Opening Production  Sales   Name    Closing
2016-06-05  100.00  0.00    0.00    NULL    100.00
2016-06-06  100.00  325.00  125.00  XYZ     300.00
2016-06-06  100.00  325.00  30.00   ABC     395.00
2016-06-06  100.00  325.00  100.00  PQR     325.00
2016-06-07  200.00  0.00    0.00    NULL    200.00

我所做的如下:

SELECT PS.Date, PS.OpeningStock , PS.TotalProduction
, SUM(COALESCE(SD.Qty,0)) AS SALES, CM.Name
, (COALESCE(PS.OpeningStock,0)) + COALESCE(PS.TotalProduction,0) - SUM(COALESCE(SD.Qty,0)) AS ClosingStock
FROM ProductStock PS LEFT JOIN SalesMaster SM ON PS.Date = SM.Date
LEFT JOIN SalesDetails SD ON SM.Id = SD.SalesId
LEFT JOIN CustomersMaster CM ON SM.CustomerId = CM.Id
GROUP BY PS.Date, CM.Name, PS.OpeningStock, PS.TotalProduction
ORDER BY PS.Date

我还尝试使用 LAG,因为我使用的是 SQL Server 2012,但我不知道如何应用。

最佳答案

这应该会让你接近。您可以使用 SUM() OVER() 获取销售总额,然后使用它计算数量。

;WITH ProductDetail AS (
    SELECT  ps.[Date],
            ps.OpeningStock,
            ps.TotalProduction,
            ps.ClosingStock,
            sm.CustId,
            COALESCE(SUM(Qty),0) Sales,
            ROW_NUMBER() OVER (PARTITION BY ps.[Date] ORDER BY CustID) Rn,
            SUM(SUM(Qty)) OVER (PARTITION BY ps.[Date] ORDER BY CustID) SalesRunningTotal
    FROM    ProductStock ps
            LEFT JOIN SalesMaster sm ON ps.[Date] = sm.[Date]
            LEFT JOIN SalesDetail sd ON sd.SalesID = sm.ID
    GROUP BY ps.[Date],
            ps.OpeningStock,
            ps.TotalProduction,
            ps.ClosingStock,
            sm.CustId
)
SELECT  [Date],
        CASE WHEN Rn = 1 THEN OpeningStock ELSE OpeningStock + (TotalProduction - SalesRunningTotal + Sales) END OpeningStock,
        CASE WHEN Rn = 1 THEN TotalProduction ELSE 0 END [Production],
        Sales,
        CustId,
        CASE WHEN Rn = 1 THEN OpeningStock + TotalProduction - Sales 
            ELSE OpeningStock + (TotalProduction - SalesRunningTotal) 
            END [ClosingStock]
FROM    ProductDetail

关于sql - 按每笔销售显示库存详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37660162/

相关文章:

sql-server - 尝试读取跟踪文件时出现 SQL Server 错误 5 : “5(Access is denied. )

mysql - 无法从两个表中获取唯一值

sql - Rails - 一个模型上的两个外键都指向同一个模型

sql - Postgresql:将列子集和子查询结果组装成 JSON 文档

sql-server - BUILTIN\Administrators 已删除 - 如何撤消

asp.net - MSSQL DateDiff 两个日期之间以及所有行的平均耗时

mysql - 如何检查子查询结果中是否存在ID?

sql - MS Access 2007 SQL 查询问题

sql - Sql 中的分组依据和联合

SQL 服务器 : change column to not null in a very large table