Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何使用SQL Server获取一年中一周的计数(项目)_Sql Server - Fatal编程技术网

Sql server 如何使用SQL Server获取一年中一周的计数(项目)

Sql server 如何使用SQL Server获取一年中一周的计数(项目),sql-server,Sql Server,这是一个有点难解释我需要做什么,但我会尽我最大的努力,请帮助我。实际工作要复杂得多,但是,我需要知道如何先做基本的工作 假设我有一个名为table-a的表,ID是主键,TYPE和Approved Date年(“Approved Date”)的范围实际上是几年。我希望有一个SELECT语句,它在指定年份中每周运行COUNT(TYPE)(在本例中为WHERE year=2011),如何解决此问题 在我的公司,目前,我们使用一个Excel文件,它刚刚下载了整个表格,并用大量额外的列进行了大量计算,以得

这是一个有点难解释我需要做什么,但我会尽我最大的努力,请帮助我。实际工作要复杂得多,但是,我需要知道如何先做基本的工作

假设我有一个名为
table-a
的表,
ID
是主键,
TYPE
Approved Date
年(“Approved Date”)的范围实际上是几年。我希望有一个
SELECT语句
,它在指定年份中每周运行
COUNT(TYPE)
(在本例中为
WHERE year=2011
),如何解决此问题

在我的公司,目前,我们使用一个Excel文件,它刚刚下载了整个表格,并用大量额外的列进行了大量计算,以得到这个结果


您必须使用动态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 | |类型| 2013年第1周| 2013年第2周| ---------------------------------------- |A | 4 | 1| |B | 2 | 2|
下面是演示

您必须使用动态SQL和
透视
来实现您的目标

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 | |类型| 2013年第1周| 2013年第2周| ---------------------------------------- |A | 4 | 1| |B | 2 | 2|
这里是演示

这接近您需要的。谢谢-可以在一年中自动创建第1周到第52周,而不是手动创建52周?这接近您需要的。谢谢-可以在一年中自动创建第1周到第52周,而不是手动创建52周?非常感谢。Looks非常复杂:(但我会尽力听你的。看起来很复杂:(但我会试试。)