每周生成报告

use*_*816 1 sql sql-server-2008

我正在尝试每周获取报告,以了解有多少人实际使用该产品的状态.

这是我目前的查询

select 
COUNT(*) as 'TotalPurchased',
SUM(case when date<= DATEADD(day, -7, GETDATE())THEN 1 ELSE 0 END) as 'week1' 
from #myreport
Run Code Online (Sandbox Code Playgroud)

我希望输出为

Totalpurchased   week1  week2 week3 ..........so on
  82              80     14    16
Run Code Online (Sandbox Code Playgroud)

它应该到年底.

我从上面的查询中获得输出仅一周.我正在使用sql 2008 r2环境从临时表中获取数据.

Har*_* CO 7

您可以使用动态sql,PIVOT如果您一直想要返回列,请执行此操作:

DECLARE @cols AS VARCHAR(8000),
    @query  AS VARCHAR(8000)

SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(YrWeek) 
                    FROM (SELECT DISTINCT CAST(YEAR(rpt_dt)AS VARCHAR(4)) + '-' + CAST(DATEPART(week,rpt_dt)AS VARCHAR(2))'YrWeek'
                          FROM #myreport
                          WHERE rpt_dt > DATEADD(YEAR,-1,GETDATE()))sub
                    ORDER BY LEFT(YrWeek,4) DESC,RIGHT(YrWeek,2)DESC
                   FOR XML PATH(''), TYPE
            ).value('.', 'VARCHAR(MAX)') 
        ,1,1,'')

SET @query = 'SELECT * FROM
                (
                SELECT CAST(YEAR(rpt_dt)AS VARCHAR(4)) + ''-'' + CAST(DATEPART(week,rpt_dt)AS VARCHAR(2)) YrWeek, COUNT(*)CT
                FROM #myreport   
                GROUP BY CAST(YEAR(rpt_dt)AS VARCHAR(4)) + ''-'' + CAST(DATEPART(week,rpt_dt)AS VARCHAR(2))
                ) AS T1
                PIVOT (SUM(CT) FOR YrWeek IN ('+@cols+')) AS T2

'
EXEC(@query)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,从去年开始,它在去年每周都在拉动.

这是一个演示,只使用日期列表并记录该日期的记录,我认为这与您最终要做的事情相同.

SQL小提琴

  • @OzrenTkalčecKrznarić嗯,动态数据透视查询不是最简单的,但我认为没有一个更简单的查询可以产生所需的输出. (6认同)