如何使用SQL查询获取最近30天的记录数

问题描述 投票:0回答:1

我正在使用以下 SQL 获取当天的数据,但我希望获取过去 30 天的数据以及每个阶段的百分比

这是我的SQL

DECLARE @date DATE
SET @date = CONVERT(DATE, GETDATE())

SELECT  CASE
                    WHEN @date > X.PresentationDate AND @date < GiveAwayDate THEN 'D3'
                    WHEN @date >= DATEADD(DD, -4, X.PresentationDate) AND @date <= X.PresentationDate THEN 'D2'
                    WHEN @date < DATEADD(DD, -4, X.PresentationDate) THEN 'D1'
                    ELSE 'Unknown'
        END AS 'Stage',
        COUNT(*) AS 'Count'
FROM(
        SELECT DISTINCT     GiveAwayDate,
                            CreatedD AS 'CreatedDate',
                            CONVERT(DATE, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Comm, 'Cancel Date: ', ''), 'th ', ' '), 'rd ', ' '), 'nd ', ' '), '1st ', '1 ')) AS 'PresentationDate'
        FROM                A_CD CD
        INNER JOIN(
                            SELECT DISTINCT
                                    Bran,
                                    Agent,
                                    Reference
                            FROM
                                    Loans
                            WHERE
                                    InsertDate = @date) A
        ON                  LEFT(CD.Bran, 1) = A.Bran
        AND                 CD.Agent = A.Agent
        AND                 CD.Reference = A.Reference
        WHERE               Comm2 = 'D1'
        AND     LTRIM(RTRIM(Done)) = ''
        AND     CreatedD              != @date
        AND     GiveAwayDate                > @date) X
GROUP BY CASE
                    WHEN @date > X.PresentationDate AND @date < GiveAwayDate THEN 'D3'
                    WHEN @date >= DATEADD(DD, -4, X.PresentationDate) AND @date <= X.PresentationDate THEN 'D2'
                    WHEN @date < DATEADD(DD, -4, X.PresentationDate) THEN 'D1'
                    ELSE 'Unknown'
        END

上面的 SQL 给出如下输出

Stage   Count
D1      818
D2      839
D3      56

我现在想修改 SQL,这样它应该给出 过去 30 天每个阶段的计数和百分比,而不是今天的日期。

Stage   Count Percentage
D1      818   47.75
D2      839   48.97
D3      56    3.38

我尝试了一些

DECLARE @date DATE
DECLARE @prevDate DATE
SET @date = CONVERT(DATE, GETDATE())
SET @prevDate = DATEADD(day,-30,@date)
    
    SELECT  CASE
                        WHEN @date > X.PresentationDate AND @date < GiveAwayDate THEN 'D3'
                        WHEN @date >= DATEADD(DD, -4, X.PresentationDate) AND @date <= X.PresentationDate THEN 'D2'
                        WHEN @date < DATEADD(DD, -4, X.PresentationDate) THEN 'D1'
                        ELSE 'Unknown'
            END AS 'Stage',
            COUNT(*) AS 'Count'
    FROM(
            SELECT DISTINCT     GiveAwayDate,
                                CreatedD AS 'CreatedDate',
                                CONVERT(DATE, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Comm, 'Cancel Date: ', ''), 'th ', ' '), 'rd ', ' '), 'nd ', ' '), '1st ', '1 ')) AS 'PresentationDate'
            FROM                A_CD CD
            INNER JOIN(
                                SELECT DISTINCT
                                        Bran,
                                        Agent,
                                        Reference
                                FROM
                                        Loans
                                WHERE
                                        InsertDate between @date AND @prevDate) A
            ON                  LEFT(CD.Bran, 1) = A.Bran
            AND                 CD.Agent = A.Agent
            AND                 CD.Reference = A.Reference
            WHERE               Comm2 = 'D1'
            AND     LTRIM(RTRIM(Done)) = ''
            AND     CreatedD              != @date
            AND     GiveAwayDate     between @date AND @prevDate) X
    GROUP BY CASE
                        WHEN @date > X.PresentationDate AND @date < GiveAwayDate THEN 'D3'
                        WHEN @date >= DATEADD(DD, -4, X.PresentationDate) AND @date <= X.PresentationDate THEN 'D2'
                        WHEN @date < DATEADD(DD, -4, X.PresentationDate) THEN 'D1'
                        ELSE 'Unknown'
            END

任何人都可以帮我吗?

sql sql-server subquery
1个回答
0
投票

这可能有用:

DECLARE @date DATE;
DECLARE @prevDate DATE;
SET @date = CONVERT(DATE, GETDATE());
SET @prevDate = DATEADD(day,-30,@date);

WITH A AS (
    SELECT
    DISTINCT
              Bran,
              Agent,
              Reference
        FROM
              Loans
       WHERE
             InsertDate between @date AND @prevDate
)
,
X AS (
    SELECT
    DISTINCT
              GiveAwayDate,
              CreatedD AS 'CreatedDate',
              CONVERT(DATE, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(Comm, 'Cancel Date: ', ''), 'th ', ' '), 'rd ', ' '), 'nd ', ' '), '1st ', '1 ')) AS 'PresentationDate'
        FROM
              A_CD  CD
              INNER JOIN  A
                      ON  LEFT(CD.Bran, 1) = A.Bran
                     AND CD.Agent = A.Agent
                     AND CD.Reference = A.Reference
       WHERE
              Comm2 = 'D1'
         AND  LTRIM(RTRIM(Done)) = ''
         AND  CreatedD  != @date
         AND  GiveAwayDate between @date AND @prevDate
)
,
C AS (
    SELECT COUNT(*) AS 'TOTAL' FROM X
)
      SELECT
              CASE
                   WHEN @date > X.PresentationDate AND @date < GiveAwayDate THEN 'D3'
                   WHEN @date >= DATEADD(DD, -4, X.PresentationDate) AND @date <= X.PresentationDate THEN 'D2'
                   WHEN @date < DATEADD(DD, -4, X.PresentationDate) THEN 'D1'
                   ELSE 'Unknown'
              END AS 'Stage',
              COUNT(*) AS 'Count',
              CONVERT( FLOAT, COUNT(*) ) / CONVERT( FLOAT, C.TOTAL ) AS 'Percentage'
        FROM
              X
              CROSS JOIN C
    GROUP BY
              CASE
                  WHEN @date > X.PresentationDate AND @date < GiveAwayDate THEN 'D3'
                  WHEN @date >= DATEADD(DD, -4, X.PresentationDate) AND @date <= X.PresentationDate THEN 'D2'
                  WHEN @date < DATEADD(DD, -4, X.PresentationDate) THEN 'D1'
                  ELSE 'Unknown'
              END
;
© www.soinside.com 2019 - 2024. All rights reserved.