2015-12-11 17 views
4

我有这个表:总和行值,如果他们的ID是在规定的范围内

+----+-------+-------------------+ 
| ID | Value |  Date  | 
+----+-------+-------------------+ 
| 1 | 8  | 12/10/2015 8:00am | 
| 1 | 10 | 12/10/2015 8:30am | 
| 1 | 5  | 12/10/2015 9:00am | 
| 1 | 11 | 12/10/2015 9:30am | 
| 2 | 8  | 12/10/2015 8:00am | 
| 2 | 6  | 12/10/2015 8:30am | 
| 2 | 8  | 12/10/2015 9:00am | 
| 2 | 9  | 12/10/2015 9:30am | 
+----+-------+-------------------+ 
etc. 

现在我有这样的查询(简化为清楚起见):

SELECT ID, MAX(Value), MIN(Date) 
FROM Values 
WHERE ID IN (1,2,3,8) 
GROUP BY (DATEPART(MINUTE, Date)/60), ID 
ORDER BY ID, MIN(Date) 

它返回的东西像这样:

+----+-------+-------------------+ 
| ID | Value |  Date  | 
+----+-------+-------------------+ 
| 1 | 10 | 12/10/2015 8:00am | 
| 1 | 11 | 12/10/2015 9:00am | 
| 2 | 8  | 12/10/2015 8:00am | 
| 2 | 9  | 12/10/2015 9:00am | 
| 3 | 12 | 12/10/2015 8:00am | 
| 3 | 6  | 12/10/2015 9:00am | 
| 8 | 51 | 12/10/2015 8:00am | 
| 8 | 58 | 12/10/2015 9:00am | 
+----+-------+-------------------+ 

我需要计算值字段的总和如果,假设,该ID是1,2或3
我希望这样的事情:

+------------+-------+-------------------+ 
| IDfield | Value |  Date  | 
+------------+-------+-------------------+ 
| IDstring1 | 30 | 12/10/2015 8:00am | 
| IDstring1 | 26 | 12/10/2015 9:00am | 
| IDstring2 | 51 | 12/10/2015 8:00am | 
| IDstring2 | 58 | 12/10/2015 9:00am | 
+------------+-------+-------------------+ 

,或者甚至更好:

+--------+--------+-------------------+ 
| Value1 | Value2 |  Date  | 
+--------+--------+-------------------+ 
| 30  | 51  | 12/10/2015 8:00am | 
| 26  | 58  | 12/10/2015 9:00am | 
+--------+--------+-------------------+ 

我需要总结是静态的,所以我想我可以去这些解决方案之一的ID,但我想不出一个办法。

我会尽力解释预期的效果更好:

值1应该包含值字段其中ID IN的SUM(1,2,3),按小时分组,因为我已经在做了我查询
值2应该简单地包含在值字段其中ID = 8

编辑:添加源表例如,校正后的当前查询(I忘记把聚集MAX()到字段值在SELECT)

编辑#2:添加更好的解释

+1

该查询是否真的执行? – jarlh

+0

那么,我试图简化它,我希望我在这个过程中没有出错......但是,我使用的那个执行得很好 – Andrea

+1

请提供样本数据和预期输出(与样本有关数据!)我不明白,你想要什么。更糟的是,我甚至无法理解逻辑... – Shnugo

回答

2

我想,我终于得到了你想要的东西:

DECLARE @tbl TABLE(ID INT, Value INT, Date DATETIME); 
INSERT INTO @tbl VALUES 
(1,10,'12/10/2015 8:00am') 
,(1,11,'12/10/2015 9:00am') 
,(2,8,'12/10/2015 8:00am') 
,(2,9,'12/10/2015 9:00am') 
,(3,12,'12/10/2015 8:00am') 
,(3,6,'12/10/2015 9:00am') 
,(8,51,'12/10/2015 8:00am') 
,(8,58,'12/10/2015 9:00am'); 

WITH Values123 AS 
(
    SELECT SUM(Value) AS Sum123,Date 
    FROM @tbl 
    WHERE ID IN(1,2,3) 
    GROUP BY Date 
) 
SELECT Values123.Sum123 
     ,(SELECT SUM(Value) FROM @tbl WHERE Date=Values123.Date AND ID=8) 
     ,Values123.Date 
FROM Values123 

结果

Sum123 Sum8 Date 
30  51  2015-10-12 08:00:00.000 
26  58  2015-10-12 09:00:00.000 
+0

谢谢,这让我更接近完美的答案。 – Andrea

2

数据库:在PostgreSQL

查询:

select sum("Value") as Value1, date from "Values" where id in(1,2,3) group by date 
Union ALL 
select sum("Value") as Value1, date from "Values" where id=8 group by date 
+0

为什么不简单地跳过你的'UNION ALL',而是做'(1,2,3,8)'中的哪个id? (不知道这是否是这个问题的答案。) – jarlh

+0

这对我非常有帮助,我没有完全按照我的要求得到它,但我想通过另一种方式感谢这一点。 – Andrea

相关问题