2016-06-30 7 views
0

Ich versuche, einen Weg zu finden, ein scheinbar komplexes Join-Szenario auszuführen, und bin unsicher, wie man das macht. Einige Hintergrundinformationen:Join über mehrere Tabellen - dann ein PIVOT anwenden, um die Daten anders anzuzeigen

-Ich habe eine 'ProjectCategory'-Tabelle, die einen Fremdschlüssel' ProjectID 'und' CategoryID 'für die Projekt- bzw. Kategorietabellen enthält. Einem Projekt könnten so viele zugewiesene Kategorien zugewiesen werden wie vorhanden (bis zu 10)

-Ich habe eine "Budget" -Tabelle und eine "Sponsor" -Tabelle.

-My ‚Projekt‘ Tabelle ist meiner ‚Haushalt‘ Tabelle im Zusammenhang, dass alle Projekte eine zugehörige BudgetID

-My ‚Budget‘ Tisch zu meinem ‚Sponser‘ Tisch, dass alle Haushalts eine haben verwandt zugehörige SponsorID.

-'project 'Tabelle und' Sponsor 'Tabelle sind nicht direkt verwandt.

Ein Beispiel für die Ergebnismenge, die ich zu bekommen versuche, ist erstens:

SponsorName(Field in sponsor table) - ProjectName - Category 
___________________________________ ___________ ________ 
A          ABC   categoryA 
A          ABC   categoryB 
A          DEF   categoryX 
A          DEF   categoryZ 

dann möchte ich eine PIVOT verwenden, um die Daten zu zeigen, wie:

SponsorName - ProjectName -categoryA - categoryB -categoryC - categoryD ... 
___________ ___________ _________ _________ _________ _________ 
A    ABC    X   X 
A    DEF       X      X 
B    EFG    X         X 

Wo die Xs Markieren Sie, welche Kategorien mit jeder Projekt-/Sponsor-Kombination verknüpft sind. Das Ausfüllen der Xs ist vielleicht etwas, das ich im Codebehind tun werde oder andere gespeicherte Prozeduren verwende, aber das ist die Grundidee dessen, was ich versuche zu tun.

Ich habe Probleme herauszufinden, wie man eine Abfrage schreibt, um den ersten Satz zurück zu bekommen, bevor ich sogar einen Drehpunkt implementiere, um ihn als zweiten Satz zu zeigen, also bin ich ein bisschen eingeschüchtert von dieser Aufgabe. Jede Hilfe sehr geschätzt, und bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen

Antwort

1

Angenommen, SQL Server, verwende ich eine gespeicherte Prozedur für den Großteil der dynamischen PIVOTS. (Siehe unten)

Die Quelle eine Tabelle, #temp sein könnte oder sogar SQL

Exec [prc-Pivot] '#Temp','Category','max(''X'')[]','SponsorName,ProjectName',null 

Returns

SponsorName ProjectName categoryA categoryB categoryD categoryX categoryZ 
A   ABC   X   X   NULL  NULL  NULL 
A   DEF   NULL  NULL  NULL  X   X 
B   EFG   X   NULL  X   NULL  NULL 

Die Stored Procedure

CREATE PROCEDURE [dbo].[prc-Pivot] (
    @Source varchar(1000),   -- Any Table or Select Statement 
    @PvotCol varchar(250),   -- Field name or expression ie. Month(Date) 
    @Summaries varchar(250),  -- aggfunction(aggValue)[optionalTitle] 
    @GroupBy varchar(250),   -- Optional additional Group By 
    @OtherCols varchar(500))  -- Optional Group By or aggregates 
AS 

--Exec [prc-Pivot] 'Select Year=Year(TR_Date),* From [Chinrus-Series].[dbo].[DS_Treasury_Rates]','''Q''+DateName(QQ,TR_Date)','avg(TR_Y10)[-Avg]','Year','count(*)[Records],min(TR_Y10)[Min],max(TR_Y10)[Max],Avg(TR_Y10)[Avg]' 


Set NoCount On 
Set Ansi_Warnings Off 

Declare @Vals varchar(max),@SQL varchar(max); 
Set @Vals = '' 
Set @OtherCols= IsNull(', ' + @OtherCols,'') 
Set @Source = case when @Source Like 'Select%' then @Source else 'Select * From '[email protected] end 
Create Table #TempPvot (Pvot varchar(100)) 
Insert Into #TempPvot 
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Source + ') A') 
Select @Vals = @Vals + ', isnull(' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot + ''' THEN '),')[', ' END),NULL) As [' + Pvot) From #TempPvot Order by Pvot 
Drop Table #TempPvot 
Set @SQL = Replace('Select ' + Isnull(@GroupBy,'') + @OtherCols + @Vals + ' From (' + @Source + ') PvtFinal ' + case when Isnull(@GroupBy,'')<>'' then 'Group By ' + @GroupBy + ' Order by ' + @GroupBy else '' end,'Select , ','Select ') 
--Print @SQL 
Exec (@SQL) 


Set NoCount Off 
Set Ansi_Warnings on 
+0

Interessanter Ansatz - so theoretisch, wenn Ich kann ein Dataset erhalten, das dem ersten Beispiel ähnelt, das ich gezeigt habe. Ich kann dieses gesamte Verfahren als @source-Parameter Ihres SP übergeben ? –

+0

SQL als Parameter, ja. Die Ergebnisse einer gespeicherten Prozedur, nein. –

+0

Wenn diese Basis sql größer oder komplexer ist, finde ich es einfacher, die Ergebnisse in einer temporären Tabelle zu speichern, nur lesbarer –