在SQL中仅显示上个月的数据

时间:2010-02-05 14:21:28

标签: sql ms-access

我被告知要创建一个查询,它将显示我们公司中最常用的十大应用程序,并且在第11行应该将所有其他行分组到其中并调用记录“Other”并将所有会话汇总在一起。

如何修改此代码以仅显示月度记录?

代码段

SELECT TOP 10 dbo_LU_APPNAME.APPNAME, Count(*) AS SessionNos
FROM dbo_LU_APPNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_APPNAME.PK_APPNAMEID =  
                                                  dbo_SDB_SESSION.FK_APPNAMEID
GROUP BY dbo_LU_APPNAME.APPNAME
ORDER BY Count(*) DESC;

UNION ALL SELECT "Other" AS APPNAME, Count(*) AS SessionNos 
FROM (dbo_LU_APPNAME 
INNER JOIN dbo_SDB_SESSION  
ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID)  
LEFT JOIN (SELECT TOP 10 dbo_LU_APPNAME.APPNAME, Count(*) AS SessionNos 
           FROM dbo_LU_APPNAME  
           INNER JOIN dbo_SDB_SESSION 
           ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID 
           GROUP BY dbo_LU_APPNAME.APPNAME
           ORDER BY Count(*) DESC) AS s  ON dbo_LU_APPNAME.APPNAME = s.APPNAME

WHERE s.APPNAME Is Null
GROUP BY "Other";

dbo_SDB_SESSION表有很多字段,我们需要使用这些字段: - SESSIONSTART - SESSIONEND

代码可能是这样的:

WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-30,Now())))

问题

如何修改上述代码才能显示上个月的数据?

这是Access 2007的SQL视图。

3 个答案:

答案 0 :(得分:1)

我担心你正在创造“死代码行走”。也就是说,虽然可以执行amazing things in SQL,但这并不总是意味着应该这样做。

是否有任何机会将其移至业务逻辑层甚至只是UI(可以为其中一个案例)?问题在于,由于基本上是 UI层要求,您的数据层代码被驱动到极高的复杂程度。

如果您使用明确命名(“可读”)的过程代码分两个阶段提取数据,那么您最终可能会得到更可维护的结果。如果采用仅限SQL的路由,最终可能会遇到一个由于其固有的复杂性而无法再次触摸的查询。

答案 1 :(得分:0)

只要你总是在下个月,并且总是只想提取前一个月,那么:

SELECT Table1.Dated, Table1.Text, Month([Dated]) AS DatedMonth
FROM Table1
WHERE (((Month([Dated]))=Month(Now())-1));

每月比较 - 因为这是一项功能,您的表现可能会有所不同。

答案 2 :(得分:0)

SELECT TOP 10 dbo_LU_APPNAME.APPNAME, Count(*) AS SessionNos
FROM dbo_LU_APPNAME INNER JOIN dbo_SDB_SESSION ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID
WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-30,Now())))
GROUP BY dbo_LU_APPNAME.APPNAME
ORDER BY Count(*) DESC;

UNION ALL SELECT "Other" AS APPNAME, Count(*) AS SessionNos 
FROM (dbo_LU_APPNAME
INNER JOIN dbo_SDB_SESSION  
ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID)  
LEFT JOIN (SELECT TOP 10 dbo_LU_APPNAME.APPNAME, Count(*) AS SessionNos 
           FROM dbo_LU_APPNAME
           INNER JOIN dbo_SDB_SESSION 
           ON dbo_LU_APPNAME.PK_APPNAMEID = dbo_SDB_SESSION.FK_APPNAMEID
           WHERE (((dbo_SDB_SESSION.SESSIONSTART) Between Now() And DateAdd("d",-31,Now())))
           GROUP BY dbo_LU_APPNAME.APPNAME
           ORDER BY Count(*) DESC) AS s  ON dbo_LU_APPNAME.APPNAME = s.APPNAME

WHERE s.APPNAME Is Null
GROUP BY "Other";

我找到了解决方案。

玩了一下。

干杯人 :)