2013-08-02 29 views
7

bảng đầu tiên của tôi dbo.Port chứa các chi tiết tổng hợp về mỗi danh mục đầu tưchọn chế độ/giá trị phương thức 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 

bảng thứ hai của tôi dbo.Security chứa chi tiết về từng danh mục đầu tư chứng khoán cá nhân

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 

tôi có thể lấy nước modal cho danh mục đầu tư 1 với truy vấn riêng biệt bên dưới. là 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 

Điều tôi muốn trả về là trả về giá trị phương thức của quốc gia và khu vực cho từng danh mục đầu tư. Có ai biết làm thế nào để kết hợp truy vấn này vào truy vấn đầu tiên hoặc bất kỳ phương pháp nào khác để tôi có thể lấy MODE(dbo.Security.Country) vv cho mỗi danh mục đầu tư để tôi kết thúc với bảng dưới đây

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 

mong muốn 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' như trong các khái niệm thống kê. Giá trị thường xuyên xảy ra nhất https://en.wikipedia.org/wiki/Mode_(statistics) – TylerDurden

Trả lời

2

Trước hết, truy vấn của bạn để truy lục quốc gia mẫu cho danh mục đầu tư 1 phải bao gồm điều khoản ORDER BY nếu không, nó sẽ chỉ trả lại quốc gia của hàng đầu tiên khớp với mệnh đề WHERE.

Thứ hai, bạn có thể đạt được kết quả mong muốn sử dụng các truy vấn inline:

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

'ORDER BY' vừa bị mất trong việc sao chép và dán, câu hỏi được chỉnh sửa ....... Truy vấn này tạo ra một giá trị phương thức của 'US' và' CORP' cho mỗi danh mục đầu tư. Nó không trả về 'DE' và' SOV' cho Port3. Hoạt động của nó như thể đang tính toán chế độ của danh mục kết hợp, chứ không phải chế độ danh mục đầu tư riêng lẻ – TylerDurden

+0

Bạn nói đúng. Lời xin lỗi của tôi. Tôi đã cập nhật câu trả lời của mình. – weenoid

+0

Vui lòng thử truy vấn đã sửa đổi của tôi. – weenoid

Các vấn đề liên quan