2012-04-03 7 views
3

Ich habe eine Tabelle wie folgt aus:SQL Server 2008 - Erstellen Sie eine Tabelle dynamisch aus einer anderen Tabelle

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 

Ich möchte eine Form der Matrix oder schwenken schaffen, damit ich mit diesem Ende:

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

Ich habe einige Pivot-Beispiele gesehen, die eine kleine Anzahl von Spaltenelementen (wie Banana, Apple, Orange) haben. Ich brauche eine unbestimmte Anzahl von Namen und eine unbestimmte Anzahl von Daten (also keine fest codierten Spaltennamen). Ich habe daran gedacht, in mehrere Tabellen zu teilen, aber ich muss immer dynamisch Datumsspalten oder Namensspalten erstellen.

Kann jemand helfen?

+0

Vielen Dank Bluefeet für die aufräumen, ich bin ein noob hier so keine Bilder posten könnte: D – AlwaysLearning

Antwort

5

Vielleicht so etwas wie folgt aus:

Testdaten

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) 

Finding eindeutige Spalten

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,'') 

Declare und Ausführen von dynamischen 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) 

Aufräumen nach mir

DROP TABLE Table1 

Ergebnis

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

Vielen Dank für Ihre Hilfe, ich schätze wirklich, dass Sie die Zeit und Mühe nehmen, um mein Problem lapidar zu lösen, einen schönen Tag haben, wie ich will – AlwaysLearning

1

Wenn Sie nur ein paar Spalten haben, können Sie eine statische Dreh verwenden:

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 

Aber es klingt wie Sie eine dynamische Dreh hierfür wollen. Dazu müssen Sie zuerst die Liste der Spalten erhalten zu schwenken und dann führen Sie Ihre Abfrage:

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) 

Hier sind einige hilfreiche Links auf dynamische schwenkt:

Pivots with Dynamic Columns in SQL Server

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

dort Es gibt viele Fragen/Antworten zu SO für dynamische Pivots.

Verwandte Themen