我正在使用以下 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
任何人都可以帮我吗?
这可能有用:
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
;