繁体   English   中英

SQL 服务器子查询错误 - 无法绑定多部分标识符

[英]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_montha.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM