2013-08-02 2 views
7

私の最初のテーブルdbo.Portマイ秒台dbo.Security私はモーダル国を取得することができ、個々の証券SELECTモード/モーダル値SQL

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 

各ポートフォリオについての詳細が含まれてい

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 

各ポートフォリオに関する集約の詳細が含まれていますポートフォリオ1については、以下の個別クエリを使用します。私は私のクエリが返すようにしたいどのような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 

これは、各ポートフォリオの国や部門のモーダル値を選択入社クエリを返すことです。誰もが、私は、各ポートフォリオのためMODE(dbo.Security.Country)などを取得できるように、私は以下の表

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で終わるようにするために、最初のクエリまたは任意の他の方法には、このクエリを組み込む方法を知ってい

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

'モード 'を統計的な概念のように。最も頻繁に発生する値https://en.wikipedia.org/wiki/Mode_(statistics) – TylerDurden

答えて

2

まず、ポートフォリオ1のモデル国を取得するクエリにORDER BY句を含める必要があります。それ以外の場合は、WHERE句に一致する最初の行の国を返します。

第二に、あなたはインラインクエリを使用して所望の出力を達成できる:

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'はコピーと貼り付けで失われました。質問は編集されました........このクエリは、ポートフォリオごとに「US」および「CORP」と表示されます。 Port3には 'DE'と' SOV'を返しません。個々のポートフォリオモードではなく、組み合わせたポートフォリオのモードを計算しているかのように振る舞います。 – TylerDurden

+0

あなたは正しいです。謝罪いたします。私は私の答えを更新しました。 – weenoid

+0

私の修正されたクエリを試してください。 – weenoid