Показывать только данные за предыдущий месяц в SQL - PullRequest
1 голос
/ 05 февраля 2010

Мне сказали создать запрос, который покажет 10 самых популярных приложений в нашей компании, и в 11-й строке следует сгруппировать в него все остальные строки и вызвать запись «Другое» и суммировать все сеансы вместе.

Как мне изменить этот код, чтобы показывать только ежемесячные записи?

Фрагмент кода

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())))

Вопрос

Как мне изменить вышеуказанный код, чтобы показывать только данные за предыдущий месяц?

Это представление SQL в Access 2007.

Ответы [ 3 ]

1 голос
/ 05 февраля 2010

Я обеспокоен тем, что вы создаете "ход мертвого кода". То есть, хотя вы можете делать удивительные вещи в SQL , это не всегда означает, что вы должны сделать это.

Есть ли у какая-либо возможность переместить это на уровень бизнес-логики или даже просто в пользовательский интерфейс (случай может быть сделан для любого из них)? Проблема заключается в том, что ваш код уровня данных доведен до экстремальных уровней сложности из-за требований уровня пользовательского интерфейса .

Если бы вы собирали данные в два этапа с четко названным («читаемым») процедурным кодом, вы, скорее всего, получили бы более приемлемый результат. Если вы выберете маршрут только для SQL, вы можете получить запрос, к которому никто никогда не захочет обратиться из-за его сложности.

0 голосов
/ 08 февраля 2010
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";

Я нашел решение.

Немного поигрался.

Приветствия люди :)

0 голосов
/ 05 февраля 2010

Пока вы всегда в следующем месяце и всегда просто хотите извлечь предыдущий месяц, тогда:

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

Сравнение месяца с месяцем - так как это функция, ваша производительность может отличаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...