Frage

Ich habe ein paar Tische, die wie folgt aussehen Tabelle 1

user_id   |  name
-------------------------   
x111      |   Smith, James
x112      |   Smith, Jane

etc ..

Tabelle 2

id    |   code    |    date       |  incident_code    | user_id
-----------------------------------------------------------------
1     |    102008 |   10/20/2008  |    1              | x111
2     |    113008 |   11/30/2008  |    3              | x111
3     |    102008 |   10/20/2008  |    2              | x112
4     |    113008 |   11/30/2008  |    5              | x112 

Was ich möchte ist so etwas anzuzeigen

user_id     |    user_name    |   INCIDENT IN OCT 2008   | INCIDENT IN NOV 2008
------------------------------------------------------------------------------ 
x111        |    Smith, John  |   1                      | 3
x112        |    Smith, Jane  |   2                      | 5

etc ..

Die incident_code würde durch die tatsächliche Beschreibung des Vorfalls ersetzt werden, die in einer anderen Tabelle befinden, aber ich dachte, ich würde sehen, wie der erste funktionieren würde.

Einige der Spaltenüberschriften wären statisch, während andere würden basierend auf dem Datum erstellt werden. Hat jemand einen wissen, wie ich diese SQL Server 2005 verwenden kann? Einige Beispiele wären sehr hilfreich.

Vielen Dank im Voraus

War es hilfreich?

Lösung

Hier ist eine Lösung, die erzeugt und führt die dynamische SQL mit einem Dreh:

DECLARE @pivot_list AS VARCHAR(MAX)

--
;
WITH    cols
          AS ( SELECT DISTINCT
                        'INCIDENT IN ' + LEFT(UPPER(CONVERT(VARCHAR, [date], 107)),
                                              3) + ' '
                        + SUBSTRING(UPPER(CONVERT(VARCHAR, [date], 107)), 9, 4) AS col
               FROM     so926209_2
             )
    SELECT  @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + col + ']'
    FROM    cols

--
DECLARE @template AS VARCHAR(MAX)
SET @template = 'WITH incidents AS (
SELECT  [user_id],
        incident_code,
        ''INCIDENT IN '' + LEFT(UPPER(CONVERT(VARCHAR, [date], 107)), 3)
        + '' '' + SUBSTRING(UPPER(CONVERT(VARCHAR, [date], 107)), 9, 4) AS col
FROM    so926209_2
)
,results AS (
SELECT * FROM incidents PIVOT (MAX(incident_code) FOR col IN ({@pivot_list})) AS pvt
)
SELECT results.[user_id]
    ,so926209_1.[name]
    ,{@select_list}
FROM results INNER JOIN so926209_1 ON so926209_1.[user_id] = results.[user_id]
'

DECLARE @sql AS VARCHAR(MAX)
SET @sql = REPLACE(REPLACE(@template, '{@pivot_list}', @pivot_list), '{@select_list}', @pivot_list)

--PRINT @sql
EXEC (@sql)

Wo so926209_1, so926209_2 sind Ihre Tabelle 1 und Tabelle 2

Beachten Sie, dass, wenn Sie mehrere Vorfälle in einem Monat für die gleiche Person haben, Ihr Beispiel zeigt nicht, wie Sie das behandelt werden soll. In diesem Beispiel wird nur den letzten Vorfall im Monat.

Andere Tipps

Das klingt wie eine Bericht Aufgabe. Die Berichterstattung, die oft aus einer Datenbank Perspektive als OLAP, Online Aanalytical Processing, neigt recht häufig von „traditionellem“ Datenbankzugriff, OLTP (Online Transaction Processing), dass unterscheiden es ziemlich oft aus großen Anhäufungen von Daten Spanning größere Zeiträume gemacht von Zeit. Nicht selten, die Art der Aggregation Sie suchen.

Die Verwendung einer Pivot als Tetraneutron vorgeschlagen wird für kleinere Datenmengen ausreichen. Da jedoch das Volumen der Daten, die Sie brauchen, um zu berichten wächst, können Sie etwas weiter fortgeschritten benötigen. OLAP ist vorgesehen, um von SQL Server Analysis Services (SSAS), erhältlich in den Jahren 2005 und 2008 SSAS Verwenden Sie multidimensionale Daten-Repositories erstellen können, die vorab aggregierte Daten entweder aus einer OLTP-Datenbank direkt oder aus einer Zwischen Data-Warehouse-Datenbank. Mehrdimensionale Daten (in der Regel als Würfel bezeichnet), bieten einen viel schnelleren Weg, um die Art von Daten zuzugreifen, die Sie von einem Pivot bekommen können, ohne die Leistung Ihrer Standard-Transaktionsverarbeitung in Ihrer OLTP-Datenbank zu stören.

Wenn Sie mehr als eine kleine Menge an Daten, die Sie brauchen, um zu berichten, empfehle ich Ihnen überprüfen SQL Server Analysis Services 2005, OLAP Cubes und MDX (Multidimensional Erweiterungen für T-SQL). Es ist eine größere learnig Kurve eine OLAP-Cube einzurichten, aber sobald es eingerichtet ist, die Vorteile eines mit können sehr groß sein, wenn Sie erhebliche Reporting-Anforderungen haben.

Eine Abfrage wie dies funktionieren würde:

select
    u.User_id,
    u.Name,
    Okt2008Sum = sum(case when i.date between 
        '2008-10-01' and '2008-11-01' then 1 else 0 end),
    Nov2008Sum = sum(case when i.date between 
        '2008-11-01' and '2008-12-01'then 1 else 0 end)
from #incidents i
inner join #users u on i.user_id = u.user_id
group by u.user_id, u.name

Je nach Client und wie oft haben Sie es ausführen können, können Sie diese Abfrage generieren. In SQL würde dies wie folgt aussehen:

create table #months (
    MonthName varchar(25),
    StartDate datetime
)

insert into #months values ('Okt2008','2008-10-01')
insert into #months values ('Nov2008','2008-11-01')

declare @query varchar(8000)
select @query = 'select u.User_id, u.Name '

select @query = @query + ', ' + MonthName + 
    ' = sum(case when i.date between ''' + cast(StartDate as varchar) + 
    ''' and ''' + cast(dateadd(m,1,StartDate) as varchar) + 
    ''' then 1 else 0 end) '
from #Months

select @query = @query + '
    from #incidents i
    inner join #users u on i.user_id = u.user_id
    group by u.user_id, u.name'

exec (@query)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top