我有几个表,其看起来像这样 表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_1so926209_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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top