Количество записей, где дата в прошлом месяце - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть такая таблица

Table

А потом я хочу добавить столбец помимо общего столбца. Столбец LastMonthTotal с той же записью, но дата - в прошлом месяце. как я могу получить его?

вот здесь DDL

CREATE TABLE [dbo].[ERA_Report2](
    [RESULT] [nvarchar](255) NULL,
    [CLASSIFICATION_2] [nvarchar](255) NULL,
    [ARMADA] [nvarchar](255) NULL,
    [CDAREA] [nvarchar](255) NULL,
    [BRAND] [nvarchar](255) NULL,
    [MODEL] [nvarchar](255) NULL,
    [Shift] [nvarchar](255) NULL,
    [AST_POINT] [nvarchar](255) NULL,
    [SOURCE] [nvarchar](255) NULL,
    [AREA] [nvarchar](255) NULL,
    [POST DATE] [nvarchar](255) NULL,
    [PRICE] [float] NULL,
    [DISC] [float] NULL,
    [Net Payment] [float] NULL
)

мой запрос, подобный этому,

WITH step1 AS (
SELECT [RESULT],[CLASSIFICATION_2],[ARMADA],[CDAREA],[BRAND],[MODEL],[Shift],[AST_POINT],[SOURCE],[AREA]
      ,CONVERT(DATE, [POST DATE]) AS [POST DATE],COUNT(*) AS Total
FROM [AstraWorldDB].[dbo].[ERA_Report2]
GROUP BY [RESULT],[CLASSIFICATION_2],[ARMADA],[CDAREA],[BRAND],[MODEL],[Shift],[AST_POINT],[SOURCE],[AREA]
        ,[POST DATE]
),

step2 AS (
SELECT [RESULT],[CLASSIFICATION_2],[ARMADA],[CDAREA],[BRAND],[MODEL],[Shift],[AST_POINT],[SOURCE],[AREA]
      ,[POST DATE],Total      
      ,CASE
            WHEN MONTH([POST DATE]) > DATEPART(MONTH, DATEADD(MONTH, -1, [POST DATE]))
            THEN (SELECT COUNT(*)
                  FROM step1 
                  WHERE DATEPART(MONTH, [POST DATE]) = DATEPART(MONTH, DATEADD(MONTH, -1, [POST DATE])) AND
                        DATEPART(YEAR, [POST DATE]) = DATEPART(YEAR, DATEADD(MONTH, -1, [POST DATE]))
                  )
            ELSE '0'
       END AS LastMonthTotal
FROM step1 
)

SELECT *
FROM step2
WHERE AREA = 'DPS'
ORDER BY [POST DATE]

, но он возвращает 0, когда не должен. Это результат, результат

, где POST DATE = 2020-02-01, LastMonthTotal должен быть 2.

1 Ответ

0 голосов
/ 26 апреля 2020

Во всех поддерживаемых версиях SQL Server вы должны использовать LAG() - при условии, что каждый месяц содержит данные:

select t.*,
       lag(total) over (partition by [RESULT],[CLASSIFICATION_2], [ARMADA],[CDAREA], [BRAND], [MODEL], [Shift], [AST_POINT], [SOURCE], [AREA] order by [POST DATE]) as prev_month_total
from <your table> t;

Это кажется разумным предположением.

В старых версиях вы, вероятно, использовали бы join:

select t.*, tprev.total
from <your table> t left join
     <your table> tprev
     on tprev.result = t.result and . . . -- all the columns that define the group
        tprev.post_date = dateadd(month, -1, t.post_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...