Sql 如果行的ID在定义的范围内,则求和行的值
我有这张桌子:Sql 如果行的ID在定义的范围内,则求和行的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有这张桌子: +----+-------+-------------------+ | 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
+----+-------+-------------------+
| 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.
现在我有一个类似这样的问题(为了清楚起见简化):
返回如下内容:
+----+-------+-------------------+
| 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是静态的,所以我想我可以选择其中一种解决方案,但我想不出一种方法来实现
我将尝试更好地解释预期结果:
Value1应包含ID位于(1、2、3)中的值字段的总和,按小时分组,就像我在查询中已经做的那样Value2应该只包含ID=8的值字段 编辑:添加了源表示例,更正了当前查询(我忘了将聚合最大值()放入SELECT中的字段值) 编辑#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
我想我终于得到了你想要的:
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
那个查询真的执行了吗?嗯,我试着简化它,我希望我在这个过程中没有出错。。。但是,好的,我使用的那个,请提供示例数据和预期输出(与示例数据相关!),我不明白,您想要什么。更糟糕的是,我甚至无法理解逻辑…检查下面的链接,正如@Shnugo所说,您需要添加一些关于预期结果逻辑的解释。为什么不干脆跳过您的
联合所有
,而改为在(1,2,3,8)
?(不确定这是否是问题的答案。)这对我很有帮助,我没有按照我的要求完美地理解它,但我找到了另一种方法,多亏了这个。谢谢,这让我更接近完美的答案。
Sum123 Sum8 Date
30 51 2015-10-12 08:00:00.000
26 58 2015-10-12 09:00:00.000