1

我想从你们那里得到一点确认:

我有一个视图,其中包含(除其他外)列 time_in、time_out、Company、weight,它显示了公司何时将一些重量放入仓库以及何时(如果有的话)将其取出。所以它看起来像这样:

time_in       time_out      company      weight
1-07-2013     3-07-2013       A            10
2-07-2013     NULL            A            15
2-07-2013     4-07-2013       B            5
3-07-2013     NULL            B            1

ETC

现在我想为每家公司的每一天做一个平衡,所以它会是这样的:

Date               Company               Balance
1-07-2013            A                    10
1-07-2013            B                     0
2-07-2013            A                    25
2-07-2013            B                     5
3-07-2013            A                    15
3-07-2013            B                     6
4-07-2013            A                    15
4-07-2013            B                     1

ETC

虽然我知道如何计算基本的运行总计,即

SELECT a.time_IN, a.weight, (SELECT sum (b.weight) from DEPOT b 
where b.time_in <= a.time_in) as total_weight from DEPOT a

我猜想平衡会是这样的

SELECT a.time_IN, a.weight, ((SELECT sum (b.weight)
from DEPOT b where b.time_in <= a.time_in)
-(SELECT sum (c.weight) from DEPOT c
where a.time_out >= c.time_out) as balance from DEPOT a

我在这里朝着正确的方向前进吗?另外,我是否必须简单地添加 GROUP BY 公司才能按公司获取信息?

4

1 回答 1

3

如果您想要每日记录,您将需要一个列出所有日期的驱动程序表,然后JOIN使用您设置的时间输入/输出范围到该表。然后我觉得加入后每天设置体重值是有意义的,这样你就可以简单地做你的跑步总和。这有效:

DECLARE @min_dt date = (SELECT MIN(time_in) FROM #Table1)
       ,@max_dt date = (SELECT MAX(time_out) FROM #Table1)
;WITH cte AS (SELECT @min_dt AS dt
              UNION ALL
              SELECT DATEADD(DAY,1,dt)
              FROM cte
              WHERE dt < @max_dt)
     ,cte2 AS (SELECT a.dt,b.company,CASE WHEN a.dt = b.time_in THEN b.weight
                             WHEN a.dt = b.time_out THEN b.weight *-1
                             ELSE 0
                        END AS signed_weight
               FROM cte a
               LEFT JOIN #Table1 b
                 ON a.dt BETWEEN b.time_in AND ISNULL(b.time_out,'2099-12-31')) 
SELECT dt,company,(SELECT SUM(b.signed_Weight) 
                   FROM cte2 b 
                   WHERE a.company = b.company
                     AND b.dt <= a.dt) 
FROM cte2 a
GROUP BY a.dt,company
ORDER BY a.company, dt
OPTION (MAXRECURSION 0);

演示:SQL 小提琴

注意:如果您希望每个公司的每一天(上面的版本仅涵盖每个公司的最小/最大条目之间的日期),您需要驱动程序表具有所有公司/日期组合。

于 2013-09-20T04:29:05.140 回答