题
我有几个表,其看起来像这样 表1
user_id | name
-------------------------
x111 | Smith, James
x112 | Smith, Jane
等。
表2
id | code | date | incident_code | user_id
-----------------------------------------------------------------
1 | 102008 | 10/20/2008 | 1 | x111
2 | 113008 | 11/30/2008 | 3 | x111
3 | 102008 | 10/20/2008 | 2 | x112
4 | 113008 | 11/30/2008 | 5 | x112
我想显示的是这样的
user_id | user_name | INCIDENT IN OCT 2008 | INCIDENT IN NOV 2008
------------------------------------------------------------------------------
x111 | Smith, John | 1 | 3
x112 | Smith, Jane | 2 | 5
等。
在incident_code将由它位于另一个表中的事件的实际描述被取代,但我想我看到如何做到这一点的第一工作。
一些列标题的将是静态的,而其他人则基于该日期来创建。 有谁一个知道我可以使用SQL Server 2005这样做呢?一些示例将是非常有益的。
在预先感谢
解决方案
这里的生成和运行具有枢轴动态SQL的溶液:
DECLARE @pivot_list AS VARCHAR(MAX)
--
;
WITH cols
AS ( SELECT DISTINCT
'INCIDENT IN ' + LEFT(UPPER(CONVERT(VARCHAR, [date], 107)),
3) + ' '
+ SUBSTRING(UPPER(CONVERT(VARCHAR, [date], 107)), 9, 4) AS col
FROM so926209_2
)
SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + col + ']'
FROM cols
--
DECLARE @template AS VARCHAR(MAX)
SET @template = 'WITH incidents AS (
SELECT [user_id],
incident_code,
''INCIDENT IN '' + LEFT(UPPER(CONVERT(VARCHAR, [date], 107)), 3)
+ '' '' + SUBSTRING(UPPER(CONVERT(VARCHAR, [date], 107)), 9, 4) AS col
FROM so926209_2
)
,results AS (
SELECT * FROM incidents PIVOT (MAX(incident_code) FOR col IN ({@pivot_list})) AS pvt
)
SELECT results.[user_id]
,so926209_1.[name]
,{@select_list}
FROM results INNER JOIN so926209_1 ON so926209_1.[user_id] = results.[user_id]
'
DECLARE @sql AS VARCHAR(MAX)
SET @sql = REPLACE(REPLACE(@template, '{@pivot_list}', @pivot_list), '{@select_list}', @pivot_list)
--PRINT @sql
EXEC (@sql)
其中so926209_1
,so926209_2
是你的表1和表2
请注意,如果您在一个月内为同一人多次事故,你的例子并不告诉你如何想要的处理。本实施例中只需要最后入射在一个月。
其他提示
这听起来像一个报告任务。报告,往往是从数据库的角度为OLAP,在线Aanalytical处理的简称,倾向于从“传统”的数据库访问,OLTP(联机事务处理),在相当频繁不同,它往往由数据跨越更大周期的大聚集的的时间。相当频繁,那种聚集你的寻找。
使用一个枢轴的作为建议的Tetraneutron将足以较小的数据集。然而,随着数据的需要报告的量的增长,你可能需要一些更先进。 OLAP提供了一种通过SQL Server分析服务(SSAS),可以在2005年和2008年使用SSAS可以创建多维数据存储库,从任何一个OLTP数据库直接预聚合数据,或从中间数据仓库数据库。多维数据(通常被称为立方体),提供访问的数据类型,你可以从一个枢轴获得更快的方式,没有与您的标准交易处理您的OLTP数据库性能的干扰。
如果你有比你需要报告的数据量小多了,我建议你看看SQL Server分析服务2005年,OLAP,多维数据集,和MDX(多维扩展的T-SQL)有一个较大主义学习曲线建立OLAP多维数据集,但一旦建立起来,有它的好处是巨大的,如果你有显著的报告需求。
像这样的查询将工作:
select
u.User_id,
u.Name,
Okt2008Sum = sum(case when i.date between
'2008-10-01' and '2008-11-01' then 1 else 0 end),
Nov2008Sum = sum(case when i.date between
'2008-11-01' and '2008-12-01'then 1 else 0 end)
from #incidents i
inner join #users u on i.user_id = u.user_id
group by u.user_id, u.name
根据您的客户端,以及如何往往你要运行它,您可以生成此查询。在SQL这将是这样的:
create table #months (
MonthName varchar(25),
StartDate datetime
)
insert into #months values ('Okt2008','2008-10-01')
insert into #months values ('Nov2008','2008-11-01')
declare @query varchar(8000)
select @query = 'select u.User_id, u.Name '
select @query = @query + ', ' + MonthName +
' = sum(case when i.date between ''' + cast(StartDate as varchar) +
''' and ''' + cast(dateadd(m,1,StartDate) as varchar) +
''' then 1 else 0 end) '
from #Months
select @query = @query + '
from #incidents i
inner join #users u on i.user_id = u.user_id
group by u.user_id, u.name'
exec (@query)