2013-07-14 119 views
0

这有点难以解释我需要做什么,但我会尽我所能并请帮助我。真正的工作要复杂得多,但是,我需要知道如何做到基本的第一。如何使用SQL Server获取每周的计数(项目)

假设我有一个表称为TABLE-AID是主键,TYPEApproved DateYEAR('Approved Date')实际上一系列的几年。我想有一个SELECT STATEMENT其中运行的COUNT(TYPE)在指定的一年每星期(在这种情况下WHERE YEAR = 2011。我怎么能解决这个问题?

在我的公司,目前,我们使用一个Excel文件,该文件只下载整个表,做了很多的计算有大量额外的列,只是为了得到这样的结果。

enter image description here

+1

此[问题](http://stackoverflow.com/questions/6410134/how-to-select-sql-results-group逐周)接近你所需要的。 – Fung

+0

谢谢 - 可以在一年内自动创建第1周到第52周,而不是手动创建52周? – user2103670

回答

3

你必须使用动态SQL和PIVOT,以实现自己的目标

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) 

SET @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME('week ' + CONVERT(NVARCHAR(2), DATEPART(isowk, adate)) 
                + ' - ' + CONVERT(NVARCHAR(4), YEAR(adate))) 
      FROM Table1 
      ORDER BY 1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)'),1,1,'') 

SET @sql = 'SELECT type, ' + @cols + 
      ' FROM 
      (
       SELECT type, 
        ''week '' + CONVERT(NVARCHAR(2), DATEPART(isowk, adate)) 
           + '' - '' 
           + CONVERT(NVARCHAR(4), YEAR(adate)) week, 
        COUNT(*) type_count 
       FROM table1 
       WHERE adate BETWEEN ''20130101'' AND ''20131231'' 
       GROUP BY type, YEAR(adate), DATEPART(isowk, adate) 
      ) x 
      PIVOT 
      (
       MAX(type_count) FOR week IN (' + @cols + ') 
      ) p 
      ORDER BY type' 

EXECUTE(@sql) 

示例输出:

 
| TYPE | WEEK 1 - 2013 | WEEK 2 - 2013 | 
---------------------------------------- 
| A |    4 |    1 | 
| B |    2 |    2 | 

这里是SQLFiddle演示

+0

非常感谢。看起来非常复杂:(但我会尝试 – user2103670

+0

@ user2103670你很受欢迎,祝你好运:) – peterm

相关问题