2013-08-02 12 views
7

Moja pierwsza tabela dbo.Port zawiera zagregowane dane dotyczące każdego portfelatryb SELECT/wartość modalna 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 

Moja druga tabela dbo.Security zawiera dane o każdym portfeli poszczególnych papierów

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 

mogę odzyskać kraj modalne dla portfela 1 z poniższym osobnym zapytaniem. który jest 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 

Co chcę moje zapytanie do powrotu jest powrót do dołączył zapytanie, które wybiera modalne wartości kraju i sektora dla każdego portfela. Czy ktoś wie jak włączyć tę kwerendę do pierwszego zapytania lub jakiejkolwiek innej metody, aby można było pobierać MODE(dbo.Security.Country) itd dla każdego portfela tak, że kończy się z poniższą tabelą

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 

Pożądany 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' jak w koncepcji statystycznej. Najczęściej występująca wartość https://en.wikipedia.org/wiki/Mode_(statistics) – TylerDurden

Odpowiedz

2

Przede wszystkim zapytanie o pobranie kraju modelu dla portfela 1 powinno zawierać klauzulę ORDER BY, w przeciwnym razie po prostu zwróci kraj pierwszego wiersza, który pasuje do klauzuli WHERE.

Po drugie, można osiągnąć pożądany wynik za pomocą wbudowanych zapytania:

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

"ZAMÓWIENIE PRZEZ" właśnie zgubiło się w kopiowaniu i wklejaniu, pytanie edytowane ....... To zapytanie tworzy modalną wartość 'US' i' CORP' dla każdego portfela. Nie zwraca 'DE' i' SOV' dla Port3. Działa tak, jakby obliczał tryb połączonych portfeli, a nie poszczególne tryby portfela – TylerDurden

+0

Masz rację. Przepraszam. Zaktualizowałem swoją odpowiedź. – weenoid

+0

Czy możesz wypróbować moje zmienione zapytanie. – weenoid