2013-08-02 37 views
7

La mia prima tabella dbo.Port contiene i dettagli aggregati su ogni portafogliomodalità SELECT/valore modale 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 

La mia seconda tabella dbo.Security contiene dettagli su ogni portafoglio singoli titoli

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 

posso recuperare il paese modale per il portafoglio 1 con la query separata sottostante. che è 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 

Quello che voglio la mia domanda per tornare è quello di restituire una query uniti che seleziona i valori modali del paese e settore per ciascun portafoglio. Qualcuno sa come incorporare questa query nella prima query o qualsiasi altro metodo in modo che possa recuperare MODE(dbo.Security.Country) ecc per ogni portafoglio in modo che io alla fine con la tabella sottostante

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 

SQL desiderata

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' come nel concetto statistico. Il valore più frequente https://en.wikipedia.org/wiki/Mode_(statistics) – TylerDurden

risposta

2

Prima di tutto, la query per recuperare il paese modello per il portfolio 1 dovrebbe includere una clausola ORDER BY altrimenti restituirà solo il paese della prima riga che corrisponde alla clausola WHERE.

In secondo luogo, si potrebbe ottenere l'output desiderato utilizzando query in linea:

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

Il 'ORDER BY' si è appena perso nel copiare e incollare, domanda modificata ....... Questa query produce un valore modale di 'US' e' CORP' per ciascuno dei portafogli. Non restituisce 'DE' e' SOV' per Port3. Funziona come se stesse calcolando la modalità dei portafogli combinati, non le singole modalità di portafoglio – TylerDurden

+0

Hai ragione. Mie scuse. Ho aggiornato la mia risposta. – weenoid

+0

Si prega di provare la mia richiesta modificata. – weenoid