[英]Update with subquery get error: “The multi-part identifier could not be bound.” (Sql Server 2008)
[英]SQL Server Subquery Error - The Multi-Part Identifier Could Not Be Bound
我正在尝试从包含发票数据的表中按总美元提取前 50 个 sku。 我正在使用 2 个嵌套子查询。 前两个子查询单独运行时会生成预期结果。 添加最后一个查询时,出现以下 2 个错误:
消息 4104,第 16 级,State 1,第 1 行
无法绑定多部分标识符“a.year_month”。消息 4104,第 16 级,State 1,第 3 行
无法绑定多部分标识符“a.keycust3”。
请参阅下面的查询:
SELECT
a.year_month
,b.part_number
,a.keycust3
,SUM(b.gross3) AS gross4
FROM
(SELECT TOP (50)
a.part_number
,SUM(a.gross2) AS gross3
FROM
(SELECT
year_month AS yr_mnth
,part_number
,keycust3
,yr
,SUM(gross) AS gross2
FROM
AWS_Stage
GROUP BY
year_month, part_number, keycust3, yr) AS a
WHERE
yr = 2019
GROUP BY
part_number/*,
ORDER BY
gross2 DESC*/
) AS b
a
在您的 select 的顶层不可用; 它在创建b
的那一刻就丢失了。 如果要引用a
中的列,则子查询b
必须 select 它们,然后将它们b.whatever
。 因为你正在分组,你可能实际上无法做到这一点,因为当你 select 它们处于b
级别时,你要么必须将它们添加到组中(在这种情况下,它们将导致组的细分)或添加它们作为聚合(在这种情况下,它们将与不再代表的其他行值混合),因此您必须在外部级别再次加入表。
我不确定你的双重分组是什么,因为它分组和求和,然后过滤和分组,然后再次求和。 如果你有这个:
A,B,C
X,Y,2
X,Y,3
X,Z,4
A,B,1
然后你按 A,B 分组,将 C 相加,然后只有 X 然后按 A 分组并再次相加,它将来自:
--group by A B
A,B,C
X,Y,5
X,Z,4
A,B,1
至:
--where x
A,B,C
X,Y,5
X,Z,4
至:
--group by a
A,C
X,9
但是你也可能只是 WHERE X GROUP BY A SUM C - 第一个 groupby 没有给你任何东西
这里的关键点是,除了不能在外部级别使用列,如果它们没有在内部级别被选中,一旦你在分组操作中丢失了细节,你就无法找回它(它是就像图像的巨大有损压缩;一旦降级,无论电影“我需要增强和可读的车牌灰色方块”告诉你什么,它总是看起来块状和像素化); 您必须将 go 带回带有详细信息的源数据,并通过您作为组留下的任何列将分组数据加入其中
因此,我认为您可以像这样重写您的查询:
SELECT
*
FROM
AWS_Stage a
INNER JOIN
(SELECT
yr,
part_number,
SUM(a.gross) AS sumgross2019
FROM
AWS_Stage
WHERE
yr = 2019
GROUP BY
yr, part_number
) x
ON a.yr = x.yr AND a.part_number = x.part_number
但是很难从“我尝试了这个不工作的东西”和“前 50 个 sku”(当规范没有说“从去年开始”等)中知道这是否是你想要的。
如果您正在寻找“2019 年的所有详细信息加上 2019 年每个零件号的所有总和”,那就是它(我相信您可以添加前 50 个部分除外)。 也可以使用 window function 编写。
SELECT
*,
SUM(gross) OVER(PARTITION BY a.part_number) as sumgrossperpartnumber
FROM
AWS_Stage a
WHERE
a.yr = 2019
如果您正在寻找多级或多因素分组,window function 方式可能更简单。 如果要比较年份,请将 yr 移出 where 子句并将其添加到分区 by 中。 如果您想要所有年份的所有细节,但只从去年开始,您可以:
SELECT
*,
SUM(CASE WHEN yr = 2019 THEN gross ELSE 0 END) OVER(PARTITION BY a.part_number) as sumgrossperpartnumber
FROM
AWS_Stage a
由于您的别名a仅在由b别名的子选择中有效,因此问题是 select a.year_month和a.keycut3在您的主要 select 中。 b 也必须提供这些列,然后将您的主要 select 更改为
SELECT b.year_month
,b.part_number
,b.keycust3
,SUM(b.gross3) AS gross4
当然,您必须处理b中的分组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.