SQL 分组不起作用

Posted

技术标签:

【中文标题】SQL 分组不起作用【英文标题】:SQL grouping not working 【发布时间】:2013-10-06 22:01:03 【问题描述】:

我使用的是 MS SQL Server 2012

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

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

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

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

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

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

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

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

【问题讨论】:

请修改您的问题并将完整查询显示为“代码”块(不是图像)。大多数人不喜欢“保管箱”方法。这将使问题更容易回答。 看起来你已经回答了,但以后我会粘贴查询而不是链接。 【参考方案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

【讨论】:

感谢您的尝试。我收到了无法在您添加的 JOIN 中绑定列的各种错误。无法绑定多部分标识符“s.SecTypeCode”。列名“PortfolioBaseCode”无效。等等...它们需要以别名为前缀吗? 是的,我就是这么想的。如果不查看每个表的完整定义,很难判断。您可能需要将 JOIN 组件添加到派生表本身。 很高兴你让它工作了;我想这最终会让你到达那里。随时编辑我的答案以显示您为使其正常工作所做的更改。我猜您通过添加额外的 JOIN 更改了派生表定义。更新答案可能会对未来的读者有所帮助。 好的,我编辑了您的示例,该示例非常接近结果。我只需要添加以下 LEFT JOIN APXUser.vPortfolioBaseSettingEx b ON b.PortfolioBaseID = aa.PortfolioBaseID LEFT JOIN APXUser.vSecurityVariant s ON s.SecurityID = aa.SecurityID 还添加了用户自定义参数和summedpct >= @summedpct

以上是关于SQL 分组不起作用的主要内容,如果未能解决你的问题,请参考以下文章

HQL - 按连接继承类型映射的实体分组不起作用

分组按选择不起作用

猪按命令分组不起作用

按月和按年分组不起作用 mongodb

Pandas 分组 - 值占分组总数的百分比不起作用

内置函数和分组在 Microsoft Access 中不起作用