2011-01-11 2 views
0

Betrachten Sie dieses vereinfachte Szenario für eine SQL Server-Datenbank. Dies ist nicht genau die Art, wie meine Tabellen erstellt werden, aber das Beispiel ist genug für das, was ich wissen muss.Wie kann ich eine konsolidierte Version meiner SQL Server-Tabelle anzeigen?

Ich habe eine Produkttabelle mit einem Primärschlüssel, sagen wir, IdProduct, und einige andere Spalten, wie der Produktname und die Beschreibung.

Dann habe ich etwas wie eine Gesamtumsatz pro Monat Tabelle (SalesPerMonth). Diese zweite Tabelle enthält einige Felder wie

IdMonthlySale (key) 
IdProduct (foreign key to the main table) 
TotalSales (money) 
Monthy (int or smallint) 
Year (int or smallint) 

Die zweite Tabelle enthält die detaillierten Informationen. Wir können den Verkauf eines bestimmten Produkts verfolgen, indem Sie eine SELECT * FROM SalesPerMonth WHERE ProductId = xx

Aber sagen wir, ich möchte diese Daten anzeigen, als ob es nicht normalisiert wurde. Ich möchte eine flache Produkt X Monat/Jahr Tabelle, die die letzten 8 Monate zeigt. Etwas mehr oder weniger wie folgt:

Prod  * Jan * Feb * Mar * Apr * May * Jun * Jul * Aug * 
----------------------------------------------------------------------------- 
Prod 1  * 500.00* 480.00* 470.00* 510.00* 555.00* 530.00* 440.00* 490.00* 
----------------------------------------------------------------------------- 
Prod 2  * 650.00* 680.00* 670.00* 710.00* 755.00* 630.00* 740.00* 820.00* 

Nun. Ich hoffe, du kommst auf die Idee. Ich muss die resultierende Tabelle abflachen und ich muss es auf diese Weise an meine Benutzer ausgeben. Wie kann ich das erreichen? Danke im Voraus.

Antwort

1

Beginnend mit SQL Server 2005 Sie PIVOT verwenden können diese

In SQL 2000 haben Sie eine Reihe von CASE-Anweisung verwenden können, z

SELECT 
    SUM(CASE WHEN Month = 1 THEN Value ELSE 0 END) as Jan, 
    SUM(CASE WHEN Month = 2 THEN Value ELSE 0 END) as Feb, 

Wenn Sie sich nicht um die Feldnamen kümmern, können Sie Offset von einem Eingang verwenden.

DECLARE @CurrentMonth = @Input; 
DECLARE @CurrentMonth1 = @Input -1; 
DECLARE @CurrentMonth2 = @Input -2; 

und dann tun Sie SUM/CASE aus, dass

e.g. 
     SUM(CASE WHEN Month = @CurrentMonth THEN Value ELSE 0 END) as Month0, 
     SUM(CASE WHEN Month = @CurrentMonth1 THEN Value ELSE 0 END) as Month1, 

Dann in Ihrem Display (Bericht/Anwendung) Sie lösen, was als Spaltenüberschriften setzen

+0

Ja, ich es tun. .. Ich werde nachsehen. –

+0

Danke, ich werde versuchen, mit Ihrem Hinweis zu gehen. Ich werde vielleicht wieder hierher kommen und mehr Sachen fragen, aber das ist sehr hilfreich. –

+0

Danke für die Hilfe. Am Ende, nach einigen Recherchen, fand ich diesen tollen Artikel (http://www.sommarskog.se/dynamic_sql.html) über dynamisches SQL (weil ich ein dynamisches SQL benötigte, um die Spalten zu finden, die ich in meinem Pivot benötigte) und diese fantastische Stored Procedure (http://www.sommarskog.se/pivot_sp.sp), die dynamisch die Felder findet, die Sie in Ihrer Abfrage benötigen, und sie dynamisch als Spalten platziert. –

Verwandte Themen