2017-08-02 7 views
0

Ich habe eine Tabelle mit diesen Daten:Dynamische Spalten basierend auf Daten

FirstDiscovered|LastDiscovered|Application|Computer|Organisation 
---------------------------------------------------------------- 
05.03.2017  |05.08.2017 |App A  |Comp 1 |Org 1 
---------------------------------------------------------------- 
04.13.2017  |08.01.2017 |App A  |Comp 2 |Org 1 
---------------------------------------------------------------- 
05.01.2017  |08.01.2017 |App B  |Comp 2 |Org 1 
---------------------------------------------------------------- 
06.13.2017  |08.02.2017 |App A  |Comp 3 |Org 2 
---------------------------------------------------------------- 
07.14.2017  |08.02.2017 |App A  |Comp 4 |Org 2 
---------------------------------------------------------------- 
07.14.2017  |08.02.2017 |App B  |Comp 3 |Org 2 
---------------------------------------------------------------- 

ich mit einer select-Anweisung dynamischen Spalten erweitern möge, basierend auf dem Datum Attribut „firstDiscovered“ und „lastDiscovered“. Angenommen, es gibt eine Zeile mit firstDiscovered = 05.27.17 und lastDiscovered = 06.25.17. Dann erwarte ich zwei neue Spalten Mai'17 und Juni'17 mit "1" gefüllt. siehe Alle anderen Spalten (Monate), die von anderen Zeilen auf ‚0‘ oder leer, Beispiel:

FirstDiscovered|LastDiscovered|Application|Computer|Organisation|Apr 17|May 17|Jun 17|Jul 17|Aug 17 
--------------------------------------------------------------------------------------------------- 
05.03.2017  |05.08.2017 |App A  |Comp 1 |Org 1  |0  |1  |0  |0  |0 
--------------------------------------------------------------------------------------------------- 
04.13.2017  |08.01.2017 |App A  |Comp 2 |Org 1  |1  |1  |1  |1  |1 
--------------------------------------------------------------------------------------------------- 
05.01.2017  |08.02.2017 |App B  |Comp 2 |Org 1  |0  |1  |1  |1  |1 
--------------------------------------------------------------------------------------------------- 
06.13.2017  |08.02.2017 |App A  |Comp 3 |Org 2  |0  |0  |1  |1  |1 
--------------------------------------------------------------------------------------------------- 
07.14.2017  |08.02.2017 |App A  |Comp 4 |Org 2  |0  |0  |0  |1  |1 
--------------------------------------------------------------------------------------------------- 
07.18.2017  |08.02.2017 |App B  |Comp 3 |Org 2  |0  |0  |0  |1  |1 
--------------------------------------------------------------------------------------------------- 

Wäre toll, wenn mir jemand helfen.

+1

Was CASE mit basierte Ausdrücke zum Hinzufügen der "dynamischen" Spalten? – mauro

+0

Meine Vermutung, Sie möchten, dass diese Dynamik alle Spalten zwischen Anfangsmonat und Endmonat hinzufügt und diese dynamisch macht? Dies ist machbar, aber viel einfacher in einem Kreuztabellenbericht in SSRS. – KeithL

+0

Muss eine Select-Anweisung sein. SSRS kann nicht verwendet werden –

Antwort

0

Sie können wie unten abfragen:

select * from #DiscoverData d 
cross apply 
(Select top (datediff(mm,d.firstdiscovered, d.lastdiscovered) +1) 
    RowN = Right(Convert(varchar(10), Dateadd(mm, Row_Number() over(order by (Select NULL))-1 , d.FirstDiscovered),6),6)   
    from master..spt_values s1, master..spt_values s2) c 
pivot (Count(RowN) for RowN in ([Apr 17],[May 17],[Jun 17],[Jul 17], [Aug 17])) p 

Für dynamische Liste der Monate können Sie Abfrage wie unten verwenden:

Declare @cols1 varchar(max) 
Declare @query nvarchar(max) 

Select @cols1 = stuff((
    Select ','+QuoteName(RowN) from (Select min(firstdiscovered) as firstdiscovered, max(lastdiscovered) as lastdiscovered from #DiscoverData) d 
    cross apply 
    (Select top (datediff(mm,d.firstdiscovered, d.lastdiscovered) +1) 
     RowN = Right(Convert(varchar(10), Dateadd(mm, Row_Number() over(order by (Select NULL))-1 , d.FirstDiscovered),6),6)   
     from master..spt_values s1, master..spt_values s2) c 
    for xml path('')),1,1,'') 

Set @query = ' Select * from #DiscoverData d 
    cross apply 
    (Select top (datediff(mm,d.firstdiscovered, d.lastdiscovered) +1) 
     RowN = Right(Convert(varchar(10), Dateadd(mm, Row_Number() over(order by (Select NULL))-1 , d.FirstDiscovered),6),6)   
     from master..spt_values s1, master..spt_values s2) c 
    pivot (Count(RowN) for RowN in (' + @cols1 + ')) p ' 

Exec sp_executesql @query 

Ausgabe wie folgt:


+-----------------+----------------+-------------+----------+--------------+--------+--------+--------+--------+--------+ 
| FirstDiscovered | lastdiscovered | Application | computer | Organisation | Apr 17 | May 17 | Jun 17 | Jul 17 | Aug 17 | 
+-----------------+----------------+-------------+----------+--------------+--------+--------+--------+--------+--------+ 
| 2017-04-13  | 2017-08-01  | App A  | Comp 2 | Org 1  |  1 |  1 |  1 |  1 |  1 | 
| 2017-05-01  | 2017-08-01  | App B  | Comp 2 | Org 1  |  0 |  1 |  1 |  1 |  1 | 
| 2017-05-03  | 2017-05-08  | App A  | Comp 1 | Org 1  |  0 |  1 |  0 |  0 |  0 | 
| 2017-06-13  | 2017-08-02  | App A  | Comp 3 | Org 2  |  0 |  0 |  1 |  1 |  1 | 
| 2017-07-14  | 2017-08-02  | App A  | Comp 4 | Org 2  |  0 |  0 |  0 |  1 |  1 | 
| 2017-07-14  | 2017-08-02  | App B  | Comp 3 | Org 2  |  0 |  0 |  0 |  1 |  1 | 
+-----------------+----------------+-------------+----------+--------------+--------+--------+--------+--------+--------+ 
+0

Die dynamische Monatsabfrage läuft im Allgemeinen. Aber ich bekomme die Meldung "TOP-Klausel enthält einen ungültigen Wert." Das Ergebnis zeigt nicht alle Daten –

+0

Das bedeutet, dass Sie einige negative Daten im Unterschied zwischen der zuerst gefundenen und der zuletzt gefundenen Daten haben. Was müssen wir in diesem Szenario tun? –

Verwandte Themen