我有一个表格,其中的行符号表示订单日期:
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,第一个表中的数据类型只是日期时间,在第二个表中它可能是日期时间或字符串,这对我的目的并不重要。
答案 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