我被告知要创建一个查询,它将显示我们公司中最常用的十大应用程序,并且在第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视图。
答案 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";
我找到了解决方案。
玩了一下。
干杯人 :)