我正在使用MS SQL Server 2012
我有一个查询,它使用子查询来创建一个列,显示资产的总和百分比。但是我需要这个总和列按Portfoliobasecode分组,如下所示。
我尝试过分组和分区但没有成功。使用Group by结果是组合代码正确组,但summedpct仍然是所有组合的总和,而不是我想要的小计。
使用分区我收到以下错误。我可以使用Top 1,但这不会产生预期的结果。
ERROR
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
可能是我在查询中的错误位置放置分组或分区。我需要一种方法来正确分组summedpct列。
以下是查询: https://dl.dropboxusercontent.com/u/29851290/cashpercent.sql
以下是结果集和所需结果。
实际结果的问题是它取所有PercentAssets的总和并将它们放在summedpct中。
我想要的结果是这些按assetsiobasecode分组的资产百分比。注意在期望的结果集中,chambetr的summedpct是2.66,即-457.50 + 460.18
答案 0 :(得分: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