2013-08-02 9 views
7

Benim ilk tablo dbo.Port ben kalıcı ülkeyi alabilirsinizSEÇ mod/modal değer 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 

Benim ikinci tablo dbo.Security her portföyleri ile ilgili ayrıntıları içeren her portföy hakkında toplu ayrıntıları tek tek menkul kıymetler

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 

içeriyor Aşağıdaki ayrı sorgu ile portföy 1 için. hangi dönmek benim sorgu her portföy için ülkenin ve sektörün modal değerleri seçer bir katılmış sorgu döndürmektir istediğim şey 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 

olduğunu. Herkes ben her portföy için MODE(dbo.Security.Country) vb alabilir böylece aşağıdaki tabloda

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 

İstenilen SQL ile bitirmek böylece ilk sorguda veya başka bir yöntem haline bu sorguyu birleştirmek için nasıl biliyor mu

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' istatistiksel kavram olarak. En sık görülen değer https://en.wikipedia.org/wiki/Mode_(statistics) – TylerDurden

cevap

2

Her şeyden önce, model ülkeyi portföy 1 için almak için sorgunuz bir ORDER BY yan tümcesi içermelidir, aksi takdirde yalnızca WHERE yan tümcesiyle eşleşen ilk satırın ülkesini döndürecektir.

İkinci olarak, içi sorguları kullanarak istenen çıkış elde edebiliriz:

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

'' SİPARİŞ BAŞLADI '' sadece kopyalama ve yapıştırılmış, soru düzenlenmiş ....... kayboldu. Her bir portföy için "ABD" ve "CORP". Port3 için 'DE' ve' SOV' döndürmez. Kombine portföylerin modunu hesaplıyormuş gibi davranıyor, bireysel portföy modları değil – TylerDurden

+0

Haklısınız. Özür dilerim. Cevabımı güncelledim. – weenoid

+0

Lütfen değiştirilmiş sorgumu deneyebilir misiniz? – weenoid