SQL SERVER - 通过匹配行和列来创建表并放入Y或N.

时间:2011-09-30 11:27:00

标签: sql sql-server rows pivot-table

我目前有一个包含所有数据的表,使用这些数据我想创建另一个可用于审计目的的表(类似于数据透视表的布局)

以下示例:

原始数据

Name         Places Visited
----------------------------
Will         London

John         Toronto

Dave         New York

Will         London

我想要什么(类似于数据透视表,但我可以使用字母):

Name/Places Visted    London      Toronto      New York

Will                    Y           N             Y

John                    N           Y             N

Dave                    N           N             Y

非常感谢任何帮助产生这一点!

我希望自己能够很好地解释自己,但如果你想澄清一下,请告诉我。

非常感谢!!

1 个答案:

答案 0 :(得分:3)

SQL Server 2005/2008的解决方案:

DECLARE @Temp TABLE 
(
     Name NVARCHAR(100) NOT NULL
    ,Place NVARCHAR(100) NOT NULL
);

INSERT  @Temp 
SELECT 'Will','London'
UNION ALL
SELECT 'John','Toronto'
UNION ALL
SELECT 'Dave','New York'
UNION ALL
SELECT 'Will','London';

SELECT  
    pvt.Name [Name/Places Visted]
    ,CASE WHEN [London] IS NOT NULL THEN 'Y' ELSE 'N' END [London]
    ,CASE WHEN [Toronto] IS NOT NULL THEN 'Y' ELSE 'N' END [Toronto]
    ,CASE WHEN [New York] IS NOT NULL THEN 'Y' ELSE 'N' END [New York]
FROM    @Temp src
PIVOT( MAX(src.Place) FOR src.Place IN([London], [Toronto], [New York]) ) pvt
ORDER BY pvt.Name DESC;

结果:

Name/Places Visted  London Toronto New York
------------------- ------ ------- --------
Will                Y      N       N
John                N      Y       N
Dave                N      N       Y

注意:PIVOT操作产生的列是静态的。这意味着如果您使用Place='PARIS'添加记录,则应修改此查询:PIVOT( MAX(src.Place) FOR src.Place IN([London], [Toronto], [New York], [Paris])。因此,如果您的城市数量有限,则可以使用PIVOT运算符