2016-03-19 12 views
3

Ich habe eine Tabelle wie auf diesem Foto.T-SQL Dynamische Spalten Daten

enter image description here

Ich möchte wie sein:

EventTypeID|CreatedBy |2016-03-01 |2016-03-02 |2016-03-03|... 
6   | 2  |  1  |  2  |  0 |... 
9   | 4  |  0  |  1  |  3 |... 
... 

Ich habe versucht, dieses T-SQL:

DECLARE 
    @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @startdate datetime, 
    @enddate datetime, 
    @paramdef nvarchar(max) 

SET @startdate = '2013-02-01' 
SET @enddate = '2013-05-10'; 
SET @paramdef = '@startdate datetime, @enddate datetime'; 

SELECT 
    @cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(10), [Date], 120)) 
        FROM AdeccoView 
        --where datein > @startdate 
        -- and datein <= @enddate 
        GROUP BY [Date] 
        ORDER BY [Date] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = N'SELECT EventTypeID, '+ @cols + ' 
     from 
     (
      select EventTypeID, 
       [Date] = convert(varchar(10), [Date], 120), 
       dttime = cast(cast(timeout as varchar(5)), 
       row_number() over(partition by ViewID, [Date] order by [Date]) seq 
      from AdeccoViews 
      --where datein > @startdate 
       -- and datein <= @enddate 
     ) x 
     pivot 
     (
      max(dttime) 
      for [Date] in ('[email protected]+') 
     ) p ' 

exec sp_executesql @query, @paramdef, @startdate = @startdate, @enddate =  @enddate; 

EDIT:

Dies ist meine editied Version. .it scheint gut zu sein, aber ich kämpfe mit der lokalen Variablen @v_columns - Falsche Syntax in der Nähe von "+ @ v" _Columns + ". Erwartet '.', ID oder QUOTED_ID.

DECLARE 
@v_Columns VARCHAR(MAX), 
@v_StartDate DATETIME = '2011-11-01', 
@v_EndDate DATETIME = '2011-11-05', 
@v_Query VARCHAR(MAX) 

--pivot and delimit values 

SELECT @v_Columns = COALESCE(@v_Columns,'[') + convert(varchar, [Date], 111) + '],[' 
FROM 
(SELECT DISTINCT [Date] FROM AdeccoView) th 
WHERE 
th.[Date] BETWEEN @v_StartDate AND @v_EndDate 

--delete last two chars of string (the ending ',[') 

SET @v_Columns = SUBSTRING(@v_Columns, 1, LEN(@v_Columns)-2) 



SELECT Name,[Event] 
FROM 
(SELECT ViewID, emp.EmployeeD, c.EventTypeID, c.CreatedBy, emp.Name,c.[Date],  [Event] 
FROM 
    AdeccoView c 
    left join EventType r 
    on c.EventTypeID = r.EventTypeID 
    left join Employee emp on c.CreatedBy = emp.EmployeeD) p 
PIVOT 
(COUNT (EventTypeID) FOR [Date] IN ('+ @v_Columns +')) AS pvt 
ORDER BY pvt.ViewID; 

EDIT mit TOTAL Säule:

Ich versuche Gesamt Spalte einzurichten, die Daten sind jedoch nicht gut. Ich benutzen COUNT (*) über Partition:

DECLARE 
@cols AS NVARCHAR(MAX), 
@selcols AS NVARCHAR(MAX), 
@query AS NVARCHAR(MAX), 
@startdate datetime, 
@enddate datetime, 
@paramdef nvarchar(max) 

SET @startdate = '2013-02-01' 
SET @enddate = '2013-05-10'; 
SET @paramdef = '@startdate datetime, @enddate datetime'; 


SELECT 
@selcols = STUFF((SELECT ','+'ISNULL(' + QUOTENAME(convert(varchar(10), [Date], 120)) + ', 0) AS ' + QUOTENAME(convert(varchar(10), [Date], 120)) 
       FROM AdeccoView 
       --where datein > @startdate 
       -- and datein <= @enddate 
       GROUP BY [Date] 
       ORDER BY [Date] 
       FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 


SELECT 
@cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(10), [Date], 120)) 
       FROM AdeccoView 
       --where datein > @startdate 
       -- and datein <= @enddate 
       GROUP BY [Date] 
       ORDER BY [Date] 
       FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = N'SELECT CreatedBy,Name, Surname,EventTypeID,Event, '+ @selcols + ',Total 
    from 
    (
     select av.EventTypeID,av.CreatedBy,emp.Name,emp.Surname,Event, 
      convert(varchar(10), [Date], 120) [Date], 
      row_number() over(PARTITION BY [date],av.EventTypeID,av.CreatedBy order BY av.EventTypeID,av.CreatedBy) m, 
      Count(*) over(partition by av.EventTypeID) Total 
     from AdeccoView av 
     left join EventType et on et.EventTypeID = av.EventTypeID 
     left join Employee emp on av.CreatedBy = emp.EmployeeD 

    ) x 
    pivot 
    (
     max(m) 
     for [Date] in ('[email protected]+') 
    ) p ' 

exec sp_executesql @query, @paramdef, @startdate = @startdate, @enddate [email protected]; 

Antwort

2

Versuchen mit diesem

DECLARE 
    @cols AS NVARCHAR(MAX), 
    @selcols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX), 
    @startdate datetime, 
    @enddate datetime, 
    @paramdef nvarchar(max) 

SET @startdate = '2013-02-01' 
SET @enddate = '2013-05-10'; 
SET @paramdef = '@startdate datetime, @enddate datetime'; 


SELECT 
    @selcols = STUFF((SELECT ','+'ISNULL(' + QUOTENAME(convert(varchar(10), [Date], 120)) + ', 0) AS ' + QUOTENAME(convert(varchar(10), [Date], 120)) 
        FROM AdeccoView 
        --where datein > @startdate 
        -- and datein <= @enddate 
        GROUP BY [Date] 
        ORDER BY [Date] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 


SELECT 
    @cols = STUFF((SELECT ',' + QUOTENAME(convert(varchar(10), [Date], 120)) 
        FROM AdeccoView 
        --where datein > @startdate 
        -- and datein <= @enddate 
        GROUP BY [Date] 
        ORDER BY [Date] 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = N'SELECT EventTypeID, '+ @selcols + ' 
     from 
     (
      select EventTypeID,CreatedBy, 
       convert(varchar(10), [Date], 120) [Date], 
       row_number() over(PARTITION BY [date],EventTypeID,CreatedBy order BY EventTypeID,CreatedBy) m 
      from AdeccoView 
      --where datein > @startdate 
       -- and datein <= @enddate 
     ) x 
     pivot 
     (
      max(m) 
      for [Date] in ('[email protected]+') 
     ) p ' 

exec sp_executesql @query, @paramdef, @startdate = @startdate, @enddate [email protected]; 
+0

Nö, ich lief auf Fehler: auf der Linie 10 und Linie 1 - falsche Syntax nahe '2016.03.03'. Außerdem: Falsche Syntax in der Nähe von 'x'. – Stefan0309

+0

Ich mache einige Fehler jetzt sollte es funktionieren –

+0

Aber mit bearbeitetem Beitrag möchten Sie verschiedene Daten aus dem ersten post.Wenn Sie Variablen verwenden, müssen Sie Exec sp_executesql verwenden, weil dynamische Abfrage ist. –

Verwandte Themen