相关文章推荐
性感的人字拖  ·  在 Python 中操纵 json ...·  9 月前    · 
开心的炒饭  ·  Get started with ...·  11 月前    · 
鼻子大的墨镜  ·  How do set up a ...·  1 年前    · 
乖乖的冲锋衣  ·  Unable to create a ...·  1 年前    · 

我试图计算个别行与某一特定列的总数的百分比。

我能够在带有别名的 SELECT 语句中实现它,但我要在列 per 的帮助下进一步计算,在那里我推导出其他列,所以我需要在 UPDATE 查询中实现这一点。我尝试了下面的查询,但得到的是错误。

无效操作:子查询必须只返回一列

我没有任何唯一的ID。我不能在此使用 IN 语句。

我哪里做错了?

UPDATE a
SET per = (SELECT DISTINCT
             code,
             ratio_to_report(SUM(amnt)) OVER (PARTITION BY p) AS per
           FROM a 
           GROUP BY code,p,pd
WHERE per IS null;
    
5 个评论
..我删除了不一致的数据库标签。 请只用你正在使用的数据库来标记。 样本数据和期望的结果将真的有帮助。
你不应该存储你从其他数值中计算出来的数值。从表中删除PER列并创建视图。否则你会遇到这样的麻烦。
S3S
你需要提供一些样本数据和预期输出。一个带有JOIN的UPDATE很可能是你要找的,但以你的最小代码片段,不可能解决你的问题。但是,关于你的错误,任何时候你的something = (select...)(select...) 部分必须只返回单一的行和列。你已经选择了多列,这也将返回多行。所有的数据怎么能放在单一的行和列中呢?
Rao
是的,我认为我必须加入。如果我在这方面得到一些建议,将是很大的帮助。
Rao
我能够在选择语句中实现百分比值,但每一列是临时的,我需要使用每一列进行其他计算,所以我面临着困难。
sql
amazon-redshift
Rao
Rao
发布于 2019-06-28
2 个回答
TommyGunn32
TommyGunn32
发布于 2019-07-01
0 人赞同

你试图用4个值来更新1列。 想象一下,在没有子查询的情况下。

UPDATE a
SET per = code, p, pd, per
WHERE per IS null;

你的子查询必须返回一个单一的列和行。

Rao
我试着用单栏更新,但还是不成功。
Joe Harris
Joe Harris
发布于 2019-07-01
0 人赞同

你的子查询返回多个和多条行。你需要准确地告诉Redshift如何将所有返回的值和行应用到被UPDATE'ed的表中。

UPDATE tbl_a
SET tbl_a.per = code_sum.per
FROM tbl_a
JOIN (SELECT code
           , SUM(amnt) AS per
      FROM tbl_a
      GROUP BY code
     ) code_sum
   ON tbl_a.code = code_sum.code
WHERE per IS NULL