2013-08-02 21 views
7

Meine erste Tabelle dbo.Port enthält aggregierte Angaben zu den einzelnen PortfolioSELECT-Modus/Modalwert SQL

Portfolio Yield Duration Coupon 
Port1  0.62 1.10  0.98 
Port2  0.52 0.91  2.46 
Port3  0.40 0.70  0.37 

Meine zweite Tabelle dbo.Security enthält ausführliche Informationen zu den einzelnen Portfolios einzelne Wertpapiere

Portfolio Security Yield Duration Coupon Country Sector MarketValue 
Port1  Sec1  0.35 0.50  2.25 US  CORP 386.17 
Port1  Sec2  0.16 0.23  1.75 UK  CORP 224.64 
Port1  Sec3  0.98 1.96  3.00 US  CORP 148.00 
Port1  Sec4  0.78 1.40  0.00 DE  SOV  980.07 
Port2  Sec1  0.35 0.50  2.25 US  CORP 386.17 
Port2  Sec3  0.98 1.96  3.00 US  CORP 148.00 
Port3  Sec1  0.35 0.50  2.25 US  CORP 386.17 
Port3  Sec4  0.78 1.40  0.00 DE  SOV  980.07 
Port3  Sec5  0.03 0.06  0.00 DE  SOV  952.36 

ich das modale Land abrufen für Portfolio 1 mit der folgenden separaten Abfrage. das ist US

SELECT x.Country 
FROM (
    SELECT TOP 1 COUNT(dbo.Security.Country) as Count ,dbo.Security.Country 
    FROM dbo.Port 
    INNER JOIN dbo.Security ON (dbo.Port.Portfolio = dbo.Security.Portfolio) 
    WHERE dbo.Port.Portfolio = 'Port1' 
    GROUP BY dbo.Security.Country 
    ORDER BY Count DESC 
    ) x 

Was ich meine Abfrage will eine Join-Abfrage zurückzukehren zurückzukehren, die die modalen Werte von Land und Sektor für jedes Portfolio auswählt. Wer weiß, wie diese Abfrage in der ersten Abfrage zu übernehmen oder eine andere Methode, so dass ich MODE(dbo.Security.Country) usw. für jedes Portfolio abrufen kann, so dass ich mit der unten stehenden Tabelle am Ende

Portfolio Yield Duration Coupon Market Value Country Sector 
Port1  0.62 1.10  0.98 1738.88   US  CORP 
Port2  0.52 0.91  2.46 534.17   US  CORP 
Port3  0.40 0.70  0.37 2318.60   DE  SOV 

Wunsch SQL

SELECT 
dbo.Port.Portfolio 
,dbo.Port.Yield 
,dbo.Port.Duration 
,dbo.Port.Coupon 
,SUM(dbo.Security.MarketValue) 

--Not working 
,MODE(dbo.Security.Country) 
,MODE(dbo.Security.Sector) 
--Not working 

FROM dbo.Port 
INNER JOIN dbo.Security ON (dbo.Port.Portfolio = dbo.Security.Portfolio) 

GROUP BY 
dbo.Port.Portfolio 
,dbo.Port.Yield 
,dbo.Port.Duration 
,dbo.Port.Coupon 
+3

'Mode' wie im statistischen Konzept. Am häufigsten vorkommender Wert https://en.wikipedia.org/wiki/Mode_(statistics) – TylerDurden

Antwort

2

Zunächst sollte Ihre Abfrage zum Abrufen des Modelllandes für Portfolio 1 eine ORDER BY-Klausel enthalten, ansonsten wird nur das Land der ersten Zeile zurückgegeben, die der WHERE-Klausel entspricht.

Zweitens könnten Sie die gewünschte Ausgabe mit Inline-Abfragen erreichen:

SELECT 
P.Portfolio 
,P.Yield 
,P.Duration 
,P.Coupon 
,SUM(S.MarketValue) 
,(SELECT TOP 1 Country FROM dbo.Security WHERE Portfolio = P.Portfolio GROUP BY Country ORDER BY COUNT(*) DESC) Country 
,(SELECT TOP 1 Sector FROM dbo.Security WHERE Portfolio = P.Portfolio GROUP BY Sector ORDER BY COUNT(*) DESC) Sector 
FROM dbo.Port P 
INNER JOIN dbo.Security S ON (P.Portfolio = S.Portfolio) 
GROUP BY 
P.Portfolio 
,P.Yield 
,P.Duration 
,P.Coupon 
+0

Das 'ORDER BY' ist beim Kopieren und Einfügen verloren gegangen, die Frage wurde bearbeitet ....... Diese Abfrage erzeugt einen Modalwert von "US" und "CORP" für jedes der Portfolios. Es gibt nicht "DE" und "SOV" für Port3 zurück. Es verhält sich, als würde es den Modus der kombinierten Portfolios berechnen, nicht die einzelnen Portfoliomodi – TylerDurden

+0

Sie haben Recht. Entschuldigen Sie. Ich habe meine Antwort aktualisiert. – weenoid

+0

Bitte können Sie meine geänderte Abfrage versuchen. – weenoid