1

我正在使用 MS SQL Server 2012

我有一个查询,它使用子查询来创建一个显示总资产百分比的列。但是,我需要该总和列按portfoliobasecode 分组,如下所示。

我试过 group by 和 Partition 没有成功。使用 Group by 结果是投资组合代码正确分组,但 summedpct 仍然是所有投资组合的总和,而不是我想要的小计。

CashPCT

使用分区我收到以下错误。我可以使用 Top 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

可能是我将分组或分区放在查询中的错误位置。我需要一种方法来正确地对列 summedpct 进行分组。

这是查询: https ://dl.dropboxusercontent.com/u/29851290/cashpercent.sql

这是结果集和期望的结果。

CashPCT

实际结果的问题是它取所有 PercentAssets 的总和并将它们放在 summedpct 中。

我想要的结果是这些按投资组合基础代码分组的资产百分比。请注意,在所需的结果集中,chambetr 的 summedpct 为 2.66,即 -457.50+460.18

4

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 回答