Ежедневный, еженедельный и ежемесячный отчет из MS SQL - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу получать ежедневный, еженедельный и ежемесячный отчет из таблицы sql-сервера.

Структура таблицы выглядит следующим образом:

------------------------------------------
| ItemID      | CommentDate              |
-----------------------------------------
|989898797    | 2019-04-01 02:51:11.153  |
|----------------------------------------|
|989898797    | 2019-04-01 02:51:11.153  |
|----------------------------------------|
|989898797    | 2019-04-03 02:51:11.153  |
|----------------------------------------|
|989898797    | 2019-04-09 02:51:11.153  |
|----------------------------------------|
|989898797    | 2019-04-11 02:51:11.153  |
|----------------------------------------|

До сих пор я пробовал следующее,

select (select count(itemid) from ebayfeedback where ((year(commentdate) = year(getdate())) 
and datepart(m,commentdate)=datepart(m,dateadd(month,-1,getdate())))) as lastmonth,

(select count(itemid) from ebayfeedback where (year(commentdate) = year(getdate())) 
and datepart(m,commentdate)=datepart(m,dateadd(month,0,getdate()))) as thismonth,

(select count(itemid) from ebayfeedback where (year(commentdate) = year(getdate())) 
and datepart(wk,commentdate)=datepart(wk,dateadd(week,1,getdate()))) as lastweek,

(select count(itemid) from ebayfeedback where (year(commentdate) = year(getdate())) 
and datepart(wk,commentdate)=datepart(wk,getdate())  group by datepart(wk,commentdate) ) as thisweek,

(select count(itemid) from ebayfeedback where convert(varchar,commentdate,101)= 
convert(varchar,dateadd(day,-1,getdate()),101)) as yesterday,

(select count(itemid) from ebayfeedback where convert(varchar,commentdate,101)= 
convert(varchar,getdate(),101) ) as today

from ebayfeedback

Результат, полученный в нескольких строках из вышеприведенного запроса, аналогичен приведенному ниже.

---------------------------------------------------------
| lastmonth   | thismonth | lastweek | thisweek | today |
---------------------------------------------------------
|5            |    5      |    2     |   2      |  1    |
|-------------------------------------------------------|
|5            |    5      |    2     |   2      |  1    |
|-------------------------------------------------------|
|5            |    5      |    2     |   2      |  1    |
|-------------------------------------------------------|
|5            |    5      |    2     |   2      |  1    |
|-------------------------------------------------------|
|5            |    5      |    2     |   2      |  1    |
|-------------------------------------------------------|

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

Желаемый результат должен быть в одну строку, как показано ниже.


| lastmonth   | thismonth | lastweek | thisweek | today |
---------------------------------------------------------
|5            |    5      |    2     |   2      |  1    |
|-------------------------------------------------------|

Примечание: данные, которые я привел в качестве примерав вышеупомянутых обеих таблицах не фактическое, которое я имею.

1 Ответ

0 голосов
/ 12 апреля 2019

Одним из способов решения этой проблемы является использование запроса условного агрегирования для создания отчета на его основе.

Сначала создайте и заполните образец таблицы ( Пожалуйста, сохраните этот шаг в ваших будущих вопросах):

DECLARE @T AS TABLE
(
    ItemID int,
    CommentDate datetime
);

INSERT INTO @T (ItemId, CommentDate) VALUES
(989898797, '2019-04-01T02:51:11.153'),
(989898797, '2019-04-01T02:51:11.153'),
(989898797, '2019-04-03T02:51:11.153'),
(989898797, '2019-04-09T02:51:11.153'),
(989898797, '2019-04-11T02:51:11.153');

Объявление локальной переменной, чтобы сделать запрос более читабельным и предотвратить некоторые повторения кода:

DECLARE @Today date = GETDATE(), -- today's date
        @ThisWeek date = DATEADD(DAY, 1 - DATEPART(WEEKDAY, GETDATE()), GETDATE()), -- first date of the week
        @ThisMonth date = DATEADD(DAY, 1 - DATEPART(DAY, GETDATE()), GETDATE()); -- first date of the month
DECLARE @LastMonth date = DATEADD(MONTH, -1, @ThisMonth), -- first date of last month
        @LastWeek date = DATEADD(WEEK, -1, @ThisWeek) -- first date of last week

Запрос:

SELECT  COUNT(CASE WHEN CommentDate >= @LastMonth AND CommentDate < @ThisMonth THEN ItemId END) As LastMonth,
        COUNT(CASE WHEN CommentDate >= @ThisMonth AND CommentDate < DATEADD(MONTH, 1, @ThisMonth) THEN ItemId END) As thismonth,
        COUNT(CASE WHEN CommentDate >= @LastWeek AND CommentDate < @ThisWeek THEN ItemId END) As lastweek,
        COUNT(CASE WHEN CommentDate >= @ThisWeek AND CommentDate < DATEADD(WEEK, 1, @ThisWeek) THEN ItemId END) As thisweek,
        COUNT(CASE WHEN CommentDate >= @Today AND CommentDate < DATEADD(DAY, 1, @Today) THEN ItemId END) As today
FROM @T

Результаты:

LastMonth   thismonth   lastweek    thisweek    today
0           5           2           0           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...