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非常复杂:(但我会尽力听你的。看起来很复杂:(但我会试试。)