1

MS SQL Server 2012 を使用しています

サブクエリを使用して資産の合計パーセントを表示する列を作成するクエリがあります。ただし、以下に示すように、ポートフォリオベースコードでグループ化するには、合計された列が必要です。

group by と Partition を試しましたが成功しませんでした。結果によってグループ化すると、ポートフォリオ コードは正しくグループ化されますが、summedpct はまだすべてのポートフォリオの合計であり、必要に応じて小計を計算していません。

現金PCT

パーティションを使用すると、次のエラーが発生します。トップ 1 を使用できますが、これでは望ましい結果が得られません。

エラー

Msg 512, Level 16, State 1, Line 17
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

エラー

TOP 1 の使用

トップ1

クエリの間違った場所に group by または partition over を配置している可能性があります。summedpct 列を正しくグループ化する方法が必要です。

クエリは次のとおりです: https://dl.dropboxusercontent.com/u/29851290/cashpercent.sql

これが結果セットと目的の結果です。

現金PCT

実際の結果の問題は、すべての PercentAssets の合計を取得して summedpct に配置することです。

私が望む結果は、ポートフォリオベースコードによってグループ化されたアセットのこれらの割合です。目的の結果セットでは、chambetr の summedpct が 2.66、つまり -457.50+460.18 であることに注意してください。

4

1 に答える 1

1

「インライン」クエリは、パーティションごとに 1 つの行を返すため、使用できません。だから、「結合」が必要だと思います。おそらくこれはうまくいくでしょう:

 USE APXFIRM
--1. Establish the APX user session
DECLARE @SessionGUID nvarchar(70)
EXEC APXuser.pSessionInfoSetGuid @SessionGuid

--2. Execute the query against the Appraisal accounting function
DECLARE @ReportData varbinary(max)
EXEC APXUser.pAppraisal

-- Required Parameters. There may be other Optional Parameters.
@ReportData = @ReportData out,
@Portfolios = '@Test_Group',
@Date = '10/02/2013'

--3. Select the columns

SELECT
--Appraisal columns
a.MarketValue,
a.PercentAssets,
--Security Columns
s.SecuritySymbol,
s.SecurityTypeCode,

-- Portfolio Base columns
b.PortfolioBaseCode,
b.ReportHeading1,
bb.summedpct

--4. Join the Appraisal to additional views
FROM APXUser.fAppraisal (@ReportData) a
LEFT JOIN APXUser.vPortfolioBaseSettingEx b
ON b.PortfolioBaseID = a.PortfolioBaseID
LEFT JOIN APXUser.vSecurityVariant s
ON s.SecurityID = a.SecurityID


LEFT JOIN(
   SELECT PortfolioBaseCode
       , SUM(PercentAssets) as summedpct
   FROM APXUser.fAppraisal (@ReportData) aa
   LEFT JOIN APXUser.vPortfolioBaseSettingEx b
ON b.PortfolioBaseID = aa.PortfolioBaseID
LEFT JOIN APXUser.vSecurityVariant s
ON s.SecurityID = aa.SecurityID

   WHERE s.SecTypeCode LIKe 'ca%'

   AND s.SecTypeCode = aa.SecTypeCode
   AND s.IsShort = aa.IsShortPosition
   GROUP BY PortfolioBaseCode, SecurityTypeCode
   ) bb
on b.PortfolioBaseCode = bb.PortfolioBaseCode
WHERE s.SecTypeCode LIKe 'ca%'
AND s.SecTypeCode = a.SecTypeCode
AND s.IsShort = a.IsShortPosition
And summedpct >= @summedpct
于 2013-10-06T22:33:18.357 に答える