Sql 这两个日期之间的天数是365天,即7×52+1,您是否需要一个不完整的(1天)周(可能是week53),或者应该将范围调整为364天(正好是52个完整周)?@OzrenTkalčecKrznarić动态透视查询并不是最简单的,但我不认为有一个更简单的查询可

Sql 这两个日期之间的天数是365天,即7×52+1,您是否需要一个不完整的(1天)周(可能是week53),或者应该将范围调整为364天(正好是52个完整周)?@OzrenTkalčecKrznarić动态透视查询并不是最简单的,但我不认为有一个更简单的查询可,sql,sql-server-2008,Sql,Sql Server 2008,这两个日期之间的天数是365天,即7×52+1,您是否需要一个不完整的(1天)周(可能是week53),或者应该将范围调整为364天(正好是52个完整周)?@OzrenTkalčecKrznarić动态透视查询并不是最简单的,但我不认为有一个更简单的查询可以产生所需的输出。@OzrenTkalčecKrznarić不幸的是,如果OP想要返回未知数量的列,必须使用动态SQL来完成,这是正确的方法that@OzrenTkalčecKrznarić动态透视查询并不是最简单的,但我不认为有一个更简单的查


这两个日期之间的天数是365天,即7×52+1,您是否需要一个不完整的(1天)周(可能是
week53
),或者应该将范围调整为364天(正好是52个完整周)?@OzrenTkalčecKrznarić动态透视查询并不是最简单的,但我不认为有一个更简单的查询可以产生所需的输出。@OzrenTkalčecKrznarić不幸的是,如果OP想要返回未知数量的列,必须使用动态SQL来完成,这是正确的方法that@OzrenTkalčecKrznarić动态透视查询并不是最简单的,但我不认为有一个更简单的查询可以产生所需的输出。@OzrenTkalčecKrznarić不幸的是,如果OP想要返回未知数量的列,必须使用动态SQL来完成,这是正确的方法that@downvoters:否决一个正确的,记录在案的、有效的、没有评论的回答可能是无知或恶意的表现。请随意争论这里的错误。@downvorters:在没有评论的情况下否决一个正确的、有记录的、有效的答案可能是无知或恶意的表现。请随意讨论这里的问题。
select 
COUNT(*) as 'TotalPurchased',
SUM(case when date<= DATEADD(day, -7, GETDATE())THEN 1 ELSE 0 END) as 'week1' 
from #myreport
Totalpurchased   week1  week2 week3 ..........so on
  82              80     14    16
SELECT
    COUNT(*) AS 'count',
    CONVERT(nchar(4), DATEPART(year, [date]))
     + '-' + 
    CONVERT(nchar(2), DATEPART(wk, [date])) AS 'week'
FROM #myreport
WHERE
    [date] BETWEEN GETDATE() AND DATEADD(week, 52, GETDATE())
GROUP BY
    CONVERT(nchar(4), DATEPART(year, [date]))
     + '-' + 
    CONVERT(nchar(2), DATEPART(wk, [date]))
WITH ROLLUP
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)
DECLARE @start datetime = '2012-6-1'

;WITH tally AS (
  SELECT TOP 52 -- change this if you want more or less than a year of data
    N = row_number() OVER(ORDER BY (SELECT 0)) - 1
  FROM master.dbo.syscolumns sc1)
,weekSums AS (
  SELECT 
    N,
    val = 
      (SELECT COUNT(*) -- Can be ISNULL(SUM(amount), 0) or something else
      FROM #myreport
      WHERE [date] > DATEADD(dd, N * 7, @start) AND at <= DATEADD(dd, (N + 1) * 7, @start))
  FROM tally)
SELECT
  totalPurchased = (SELECT sum(val) FROM weekSums),
  week1 = (SELECT val FROM weekSums WHERE N = 0),
  week2 = (SELECT val FROM weekSums WHERE N = 1),
  week3 = (SELECT val FROM weekSums WHERE N = 2),
  ...
  week52 = (SELECT val FROM weekSums WHERE N = 51)
SELECT 
    FLOOR((DATEDIFF(DAY, 'YourStartDate', [DateColumn])) / 7) + 1 AS [Week], 
    CAST(CAST(DATEADD(WEEK, FLOOR((DATEDIFF(DAY, 'YourStartData', [DateColumn])) / 7), 'YourStartData') AS DATE) AS NVARCHAR(16)) + ' - ' + 
    CAST(CAST(DATEADD(DAY, FLOOR((DATEDIFF(DAY, 'YourStartData', [DateColumn])) / 7) * 7 + 6, 'YourStartData') AS DATE) AS NVARCHAR(16)) AS [Range], 
    COUNT(*) AS [TotalPurchased] 
FROM 
    [Table] WITH (NOLOCK) 
GROUP BY 
    FLOOR((DATEDIFF(DAY, 'YourStartDate', [DateColumn])) / 7) 
ORDER BY 
    FLOOR((DATEDIFF(DAY, 'YourStartDate', [DateColumn])) / 7) + 1