2012-04-03 82 views
3

我有这样的一个表:SQL Server 2008中 - 从另一个表动态创建一个表

Column = NAME 
Column = DATE 

NAME | DATE  | Y/N 
John | 01/01/2012 | bit 
Mary | 01/01/2012 | bit 
James | 01/01/2012 | bit 
John | 01/02/2012 | bit 
Mary | 01/02/2012 | bit 
James | 01/02/2012 | bit 
John | 01/03/2012 | bit 
Mary | 01/03/2012 | bit 
James | 01/03/2012 | bit 

我想创建某种形式的矩阵或转动的,所以我结束了这一点:

NAME | 01/01/2012 | 01/02/2012 | 01/03/2012 
John | bit  | bit  | bit 
Mary | bit  | bit  | bit 
James | bit  | bit  | bit 

我已经看到一些有少量列项目(如香蕉,苹果,橙色)的透视示例,我需要有不确定数量的名称和不确定数量的日期(所以没有硬编码列名称)。我正在考虑拆分成多个表格,但我总是需要动态创建日期列或名称列。

任何人都可以帮忙吗?

+0

谢谢你Bluefeet的收拾,我是小白在这里,所以不能发表图片: D – AlwaysLearning 2012-04-03 20:53:52

回答

5

也许是这样的:

测试数据

CREATE TABLE Table1 
(
    NAME VARCHAR(100), 
    [DATE] DATE, 
    [Y/N] BIT 
) 

INSERT INTO Table1 
VALUES 
    ('John','01/01/2012',1), 
    ('Mary','01/01/2012',0), 
    ('James','01/01/2012',1), 
    ('John','01/02/2012',0), 
    ('Mary','01/02/2012',1), 
    ('James','01/02/2012',1), 
    ('John','01/03/2012',1), 
    ('Mary','01/03/2012',0), 
    ('James','01/03/2012',0) 

找到唯一列

DECLARE @cols VARCHAR(MAX) 
;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY [DATE] ORDER BY [DATE]) AS RowNbr, 
     convert(varchar, [DATE], 103) AS [Date] 
    FROM 
     Table1 
) 
SELECT @cols=STUFF 
(
    (
     SELECT 
      ',' +QUOTENAME([Date]) 
     FROM 
      CTE 
     WHERE 
      CTE.RowNbr=1 
    FOR XML PATH('') 
    ) 
,1,1,'') 

声明并执行动态sql

DECLARE @query NVARCHAR(4000)= 
N'SELECT 
    * 
FROM 
(
    SELECT 
     Table1.NAME, 
     CAST(Table1.[Y/N] AS INT) AS [Y/N], 
     convert(varchar, Table1.[DATE], 103) AS [Date] 
    FROM 
     Table1 
) AS p 
PIVOT 
(
    MAX([Y/N]) 
    FOR [Date] IN ('[email protected]+') 
) AS pvt' 

EXECUTE(@query) 

后自己清理

DROP TABLE Table1 

结果

Name  01/01/2012 02/01/2012  03/01/2012 
James  1    1    0 
John  1    0    1 
Mary  0    1    0 
+0

谢谢大家的帮助,我真诚地感谢您花时间和精力来简洁地解决我的问题,祝您度过美好的一天 – AlwaysLearning 2012-04-04 10:12:14

1

如果你只有几列,您可以使用一个静态的支点:

create table #temp 
(
    name varchar(50), 
    date datetime, 
    yesno bit 
) 

insert into #temp values('John', '01/01/2012', 1) 
insert into #temp values('Mary', '01/01/2012', 1) 
insert into #temp values('James', '01/01/2012', 1) 
insert into #temp values('John', '01/02/2012', 0) 
insert into #temp values('Mary', '01/02/2012', 0) 
insert into #temp values('James', '01/02/2012', 0) 
insert into #temp values('John', '01/03/2012', 1) 
insert into #temp values('Mary', '01/03/2012', 0) 
insert into #temp values('James', '01/03/2012', 1) 

select name, [01/01/2012], [01/02/2012], [01/03/2012] 
from 
(
    select name, date, cast(yesno as tinyint) as yesno 
    from #temp 
) x 
pivot 
(
    max(yesno) 
    for date in ([01/01/2012], [01/02/2012], [01/03/2012]) 
) p 

drop table #temp 

但它听起来像你想为这个动态的支点。要做到这一点,你必须首先得到列的列表转动,然后运行查询:

create table test 
(
    name varchar(50), 
    date datetime, 
    yesno bit 
) 

insert into test values('John', '01/01/2012', 1) 
insert into test values('Mary', '01/01/2012', 1) 
insert into test values('James', '01/01/2012', 1) 
insert into test values('John', '01/02/2012', 0) 
insert into test values('Mary', '01/02/2012', 0) 
insert into test values('James', '01/02/2012', 0) 
insert into test values('John', '01/03/2012', 1) 
insert into test values('Mary', '01/03/2012', 0) 
insert into test values('James', '01/03/2012', 1) 

DECLARE @cols AS VARCHAR(MAX), 
    @query AS VARCHAR(MAX); 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + convert(varchar(10), t2.date, 101) 
         FROM test AS t2 
         ORDER BY '],[' + convert(varchar(10), t2.date, 101) 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 


set @query = 'select name, ' + @cols + ' 
      from 
      (
       select name, date, cast(yesno as tinyint) as yesno 
       from test 
      ) x 
      pivot 
      (
       max(yesno) 
       for date in (' + @cols + ') 
      ) p' 


execute(@query) 

这里是动态的枢轴一些有用的链接:

Pivots with Dynamic Columns in SQL Server

Using SQL Server 2005/2008 Pivot on Unknown Number of Columns (Dynamic Pivot)

有对于动态支点,SO是很多问题/答案。