SQL选择并计算之前发生的所有项目

时间:2009-08-12 20:02:35

标签: sql count

我有一个表格,其中的行符号表示订单日期:

2009-05-15 13:31:47.713 
2009-05-15 22:09:32.227
2009-05-16 02:38:36.027
2009-05-16 12:06:49.743
2009-05-16 16:20:26.680
2009-05-17 01:36:19.480
2009-05-18 09:44:46.993
2009-05-18 14:06:12.073 
2009-05-18 15:25:47.540
2009-05-19 10:28:24.150 

我想要查询返回以下内容:

2009-05-15 2
2009-05-16 5
2009-05-17 6
2009-05-18 9
2009-05-19 10

基本上,它保留了所示日期结束时所有订单的总计。订单不是当天的订单,而是自表格中最早日期以来的所有订单。

这是MSSQL 2000,第一个表中的数据类型只是日期时间,在第二个表中它可能是日期时间或字符串,这对我的目的并不重要。

5 个答案:

答案 0 :(得分:7)

我让它在SQL Server 2005上运行。我认为它也适用于2000.

SELECT dt, count(q2.YourDate)
    FROM (SELECT DISTINCT CONVERT(varchar,YourDate,101) dt FROM YourTable) t1
    JOIN YourTable q2 ON DATEADD(d,-1,CONVERT(varchar,YourDate,101)) < dt
    GROUP BY dt

这将查询表两次,但至少给出正确的输出。

答案 1 :(得分:1)

我推荐2个查询解决方案。这很慢,但我几乎每天都使用这种方法。重要的是不要在第一个查询中加入2个表。您希望查找表中每个日期的每个订单都重复。

对于您感兴趣的时间段的每个日期,您将需要一个包含1行的查找表。让我们称之为dboDateLookup。这是它的样子:

DtIndex  
2009-05-15  
2009-05-16  
2009-05-17  
2009-05-18  
2009-05-19

我们还假设订单表,dboOrders有2列,ordernumber和orderdate。

ordernumber               orderdate   
2009-05-15 13:31:47.713   1  
2009-05-15 22:09:32.227   2  
2009-05-16 02:38:36.027   3  
2009-05-16 12:06:49.743   4  
2009-05-16 16:20:26.680   5

查询1:

SELECT  
Format([ordernumber],"yyyy-mm-dd") AS ByDate,  
ordernumber,  
(If Format([orderdate],"yyyy-mm-dd")<=[DtIndex],1,0) AS NumOrdersBefore  
FROM [dboOrders], [dboDateLookUp];

查询2:

Select  
[ByDate],  
sum([NumOrdersBefore]) as RunningTotal  
from [Query1];

答案 2 :(得分:0)

试试这个(返回字符串日期):

SELECT
    LEFT(CONVERT(char(23),YourDate,121),10) AS Date
        ,COUNT(*) AS CountOf
    FROM YourTable
    GROUP BY LEFT(CONVERT(char(23),YourDate,121),10) 
    ORDER BY 1

这将是表扫描。如果它太慢,可以考虑使用带有日期索引的持久计算列,它将运行得更快。但是,我不确定你是否可以在SQL 2000中完成所有这些工作。

编辑更好地阅读问题,试试这个:

SELECT
    d.YourDate
        ,SUM(dt.CountOf) AS CountOf
    FROM (SELECT
              LEFT(CONVERT(char(23),YourDate,121),10) AS Date
                  ,COUNT(*) AS CountOf
              FROM YourTable
              GROUP BY LEFT(CONVERT(char(23),YourDate,121),10) 
        ) dt
        INNER JOIN (SELECT
                        DISTINCT LEFT(CONVERT(char(23),YourDate,121),10) AS Date
                        FROM YourTable
                   ) d ON dt.Date<=LEFT(CONVERT(char(23),d.YourDate,121),10)
    GROUP BY d.YourDate
    ORDER BY d.YourDate

答案 3 :(得分:0)

SELECT Count(*), LEFT(CONVERT(char(23),YourDate,121),10) AS Date FROM  
(SELECT  
    DISTINCT LEFT(CONVERT(char(23),YourDate,121),10) AS Date  
    FROM YourTable  
    GROUP BY LEFT(CONVERT(char(23),YourDate,121),10)) x  //Gets the distinct dates.  
INNER JOIN YourTable y on x.Date >= y.Date  
GROUP BY LEFT(CONVERT(char(23),YourDate,121),10) 

这会很慢。真的很慢。我讨厌考虑运行时间。

答案 4 :(得分:0)

我有另一个 它并不那么花哨 我在Access上运行它,因此语法可能略有不同。 但似乎有效。

P.S。我相对较新的SQL

数据:

ID  F1  F2
1   15/05/2009  13:31:47.713
2   15/05/2009  22:09:32.227
3   16/05/2009  02:38:36.027
4   16/05/2009  12:06:49.743
5   16/05/2009  16:20:26.680
6   17/05/2009  01:36:19.480
7   18/05/2009  09:44:46.993
8   18/05/2009  14:06:12.073
9   18/05/2009  15:25:47.540
10  19/05/2009  10:28:24.150

查询:

SELECT Table1.F1 AS Dates, SUM(REPLACE(Len(Table1.F2), Len(Table1.F2), 1)) AS Occurred
FROM Table1
GROUP BY Table1.F1;

结果:

Dates   Occurred
15/05/2009  2
16/05/2009  3
17/05/2009  1
18/05/2009  3
19/05/2009  1