2012-09-10 38 views
0

我有2列的表:日期和点。我想创建一个查询,返回包括今天在内的所有日子的点数。这是为了生成一个直到今天的积分表。如何写查询求和?

编辑:我觉得我的问题比较清楚之前EWS编辑吧:)

有了这样的

 
2012-01-01 1 
2012-01-02 1 
2012-01-02 2  same day as above (we can have many records for one day, you can think of it as a result of one game on that day) 
2012-01-03 -1 

数据,我想看到的结果是:

 
2012-01-01 1 
2012-01-02 4 (1+1+2) 
2012-01-03 3 (1+1+2-1) 

我m使用SQL Server 2008.如果你知道如何在LINQ to Entities中做到这一点,那就太棒了。

+0

换句话说所有的点只是一个总和,或者每天积分的总和? – dbf

+0

哪个DBMS? (PostgreSQL?MySQL?SQL-Server?Oracle?) – ruakh

+0

现在的问题已经改变。你需要什么?一个简单的总和或“运行总和”,所以一个累计? –

回答

5

如果你需要累积性,你应该试试这个:

编辑:

SELECT 
Date, 
(SELECT SUM(Point) FROM A WHERE Date <= MainTable.Date) AS Points 
FROM A MainTable 
GROUP BY Date 

这里是一个SQL Fiddle对其进行测试。

+0

我编辑了我的问题。每天可能有很多记录。我按照日期添加了分组到您的查询,现在是完美的。也许你知道是否有可能在LINQ to Entities中做到这一点? –

+0

我知道这一定很简单,但是我自己找不到解决方法。笨。 –

0

我知道这样做的唯一方法是每天都有一个新的查询。

dateVariable = "2012-09-06" 
SELECT Sum(points) From table_name WHERE Date<=dateVariable; 

显然你需要遍历所有日子来做到这一点,每次更改dateVariable。

+0

这是做到这一点的程序性方法。这是我想到的一个解决方案,但它很糟糕。我甚至不知道我会怎样称呼它,并在我的数据库中返回所有日子的金额。 –

0

我从你想要的点数运行总和的问题中了解到,所以每个日期的所有日期的点数总和小于该日期。如果是这样,请看看this article的运行总计部分。

2

部分的DBMS有更好的方法,通过使用窗口函数来做到这一点,但这里有一个查询,应在多数工作中的任何SQL数据库:

SELECT t1.date, 
     SUM(t2.points) AS points_to_date 
    FROM table_name t1 
    JOIN table_name t2 
    ON t2.date <= t1.date 
ORDER 
    BY t1.date 
; 
+0

这是无效的SQL - http://www.sqlfiddle.com/#!3/26ac8/3。我加了一组,但是然后它返回错误的结果。但它仍然帮助了我一点,所以我upvote。 –

+0

@Peri:哦,哇,哎呀,对不起!我应该首先进行测试,否则至少会发布一个我没有测试过的免责声明。 – ruakh