2016-11-16 40 views
0

我有这样的组织一组电源供电:选择一个/几夭多个行每个组

op_type | time_stamp | product | in | out 
---------------------------------------------------- 
01  | 08:00:00 | p1  | 50 | 0 
02  | 08:01:00 | p1  | 0 | 10 
02  | 08:02:00 | p1  | 0 | 35 
03  | 08:03:00 | p1  | 0 | 5 
01  | 08:04:00 | p1  | 60 | 0 
02  | 08:09:00 | p1  | 0 | 15 
01  | 08:10:00 | p1  | 30 | 0 
02  | 08:11:00 | p1  | 0 | 20 
01  | 08:00:00 | p2  | 100 | 0 
02  | 08:01:00 | p2  | 0 | 20 
02  | 08:02:00 | p2  | 0 | 45 
03  | 08:03:00 | p2  | 0 | 15 
01  | 08:03:10 | p2  | 60 | 0 
01  | 08:04:00 | p2  | 5 | 0 
02  | 08:09:00 | p2  | 0 | 30 
01  | 08:10:00 | p2  | 30 | 0 
02  | 08:11:00 | p2  | 0 | 10 

我想是选择列表巫婆SUM(in) group by product将覆盖SUM(out) group by product从给定时间开始 EX:为time_stamp>'08:05:00'我:

SUM(out) for p1=35如此之 和SUM(out) for p2=40

所以列表我想获得将

op_type | time_stamp | product | in | out 
---------------------------------------------------- 
01  | 08:04:00 | p1  | 60 | 0 
02  | 08:09:00 | p1  | 0 | 15 
01  | 08:10:00 | p1  | 30 | 0 
02  | 08:11:00 | p1  | 0 | 20 
01  | 08:03:10 | p2  | 60 | 0 
01  | 08:04:00 | p2  | 5 | 0 
02  | 08:09:00 | p2  | 0 | 30 
01  | 08:10:00 | p2  | 30 | 0 
02  | 08:11:00 | p2  | 0 | 10 

我所做的是我添加拖列到结果女巫一个有out总和与其他有in

SELECT B.*,C.sum_out FROM (SELECT A.*,SUM(in) OVER (PARTITION BY product ORDER BY time_stamp desc) AS sum_in FROM table A) B 
LEFT OUTER JOIN 
SELECT C.* FROM (SELECT product,SUM(out) AS sum_out from table GROUP BY product WHERE time_stamp>'08:05:00') C 
ON B.product=C.product 

,所以我得到的累积和:

op_type | time_stamp | product | in | out | sum_in | sum_out 
------------------------------------------------------------------------- 
01  | 08:00:00 | p1  | 50 | 0 | 140  | 35 
02  | 08:01:00 | p1  | 0 | 10 | 90  | 35 
02  | 08:02:00 | p1  | 0 | 35 | 90  | 35 
03  | 08:03:00 | p1  | 0 | 5 | 90  | 35 
01  | 08:04:00 | p1  | 60 | 0 | 90  | 35 
02  | 08:09:00 | p1  | 0 | 15 | 30  | 35 
01  | 08:10:00 | p1  | 30 | 0 | 30  | 35 
02  | 08:11:00 | p1  | 0 | 20 | 0  | 35 
01  | 08:00:00 | p2  | 100 | 0 | 195  | 40 
02  | 08:01:00 | p2  | 0 | 20 | 95  | 40 
02  | 08:02:00 | p2  | 0 | 45 | 95  | 40 
03  | 08:03:00 | p2  | 0 | 15 | 95  | 40 
01  | 08:03:10 | p2  | 60 | 0 | 95  | 40 
01  | 08:04:00 | p2  | 5 | 0 | 35  | 40 
02  | 08:09:00 | p2  | 0 | 30 | 30  | 40 
01  | 08:10:00 | p2  | 30 | 0 | 30  | 40 
02  | 08:11:00 | p2  | 0 | 10 | 0  | 40 

如果我加上一句WHERE B.sum_in<=C.sum_out我将能够得到

op_type | time_stamp | product | in | out | sum_in | sum_out 
------------------------------------------------------------------------- 
02  | 08:09:00 | p1  | 0 | 15 | 30  | 35 
01  | 08:10:00 | p1  | 30 | 0 | 30  | 35 
02  | 08:11:00 | p1  | 0 | 20 | 0  | 35 
01  | 08:04:00 | p2  | 5 | 0 | 35  | 40 
02  | 08:09:00 | p2  | 0 | 30 | 30  | 40 
01  | 08:10:00 | p2  | 30 | 0 | 30  | 40 
02  | 08:11:00 | p2  | 0 | 10 | 0  | 40 

所以我需要为每个产品再增加一行。

任何想法如何执行此?? ?? PS:我正在使用SQL SERVER 2012.

+0

是什么时间的显著'08:05:00'?它是查询的输入吗? – Squirrel

+0

是的,不要担心时间格式这只是一个虚拟数据 – Billydan

+0

什么是你想要的最终输出 – mansi

回答

2

我起草了一个可能的解决方案,你可以使用子查询来获取所有ACCUM ulated交易

  Select time_stamp, 
     (Select Sum(SQ.InEntry - SQ.OutEntry) from Table_1 AS SQ where T.time_stamp > SQ.time_stamp AND T.product = SQ.product group by product) + 
      InEntry - OutEntry 
      , T.InEntry 
      , T.OutEntry 
      , product 
      from Table_1 T 
      order by product,time_stamp 

生成随机数据我用这个语句

  declare @FromDate date = '2016-01-01' 
      declare @ToDate date = '2016-12-31' 
      declare @product varchar(50) 
      set @product = (select top 1 A.Prod from (Select 'A' AS Prod union all select 'B' AS Prod union all select 'C' AS Prod) AS A order by newid()) 

      INSERT INTO [dbo].[Table_1] 
         ([time_stamp] 
         ,[product] 
         ,[InEntry] 
         ,[OutEntry]) 
      Select 
      dateadd(day, 
          rand(checksum(newid()))*(1+datediff(day, @FromDate, @ToDate)), 
          @FromDate) 
      ,@product 
      ,0 
      ,ABS(Checksum(NewID()) % 100) 


      INSERT INTO [dbo].[Table_1] 
         ([time_stamp] 
         ,[product] 
         ,[InEntry] 
         ,[OutEntry]) 
      Select 
      dateadd(day, 
          rand(checksum(newid()))*(1+datediff(day, @FromDate, @ToDate)), 
          @FromDate) 
      ,@product 
      ,@product ,ABS(Checksum(NewID()) % 100) 
      ,0 
      GO 40  
0

您似乎不是按产品分组? 无论如何,这可能会有所帮助,您可以使用SUM & GROUP BY将您正常的聚合分组在任何时候具有合适的WHERE子句的分组上。

但是让你问什么...

SUM(中)按产品将覆盖SUM(出)

....你可以使用具有... ..

SELECT Field1, Field2, SUM(IN), SUM(OUT) 
FROM Table 
WHERE Your_where_clause 
GROUP BY Field1, Field2 
HAVING SUM(IN) >= SUM(OUT) 
+0

它将使我获得所有表格。 – Billydan

+0

我只是想指出,如果你有分组和做完了,HAVING会做你想做的。 – AntDC

+0

可能是我的解释有点差。实际上表中有一个in_price,并且每一个供给都将指向一个供应入口(in),直到入口数量结束(FIFO),所以我试图从表的末尾进行累积的入口总和通过:SUM(in)OVER(PARTITION BY product ORDER BY time_stamp desc)'并将其与out的总和进行比较:'SUM(out)AS sum_out FROM GROUP BY product'.so我正在通过OVER(PARTITION BY和GROUP BY 而且SUM(IN)> = SUM(OUT)和SUM(IN)<= SUM(OUT)都不会让我得到我想要的结果 – Billydan