【问题标题】:subquery not returning distinct results子查询不返回不同的结果
【发布时间】:2021-04-16 10:23:18
【问题描述】:

我已经有几年没有写过 SQL 了,我觉得我遗漏了一些明显的东西,但我想不通!... 我在 PGADMIN 3 版本 1.22.2 中使用 SQL 查询窗口 我想从子查询中得到一个总和,以将一个值返回到我的主查询中;主查询基于过滤客户表,子查询基于特定时期销售的商品数量并满足多个条件。 这就是我的时刻:

select customerid, account, name,
-- Aluminium
(select sum(qty_inv) from ainvdet
 where inv_account = CUST.account
  and sales_year = 2021
  and line_type = 'S'
  and layout_section = 'D'
  and qty_inv > 0
  and ((product_group like 'IN%' and (part like '%H01%' or description like 
      '%H01%')) 
   or (part like 'DCA40%' or part like 'DCA60%' or part like 'D5432%' or part 
      like 'D5433%' or part like 'D5434%' or part like '220392%' or part like 
      '220360%' or part like 'D1106%' or part like 'DL510%' or part like 
      'DL508%' or part like 'DL509%' or part like 'DL507%' or part like 
      'DT693%' or part like 'DL608%' or part like 'DL205%' or part like 
      'SPET%' or part like 'XOET%') 
   or ((part like 'E24%' and (part like '%AL%' or part like '%AZ%')) or (part 
      like 'E25%' and (part like '%AL%' or part like '%AZ%')) or part like 
      'E70%' or  part like 'E71%' or part like 'LANCIA%' or part like 
      'TC163%' or part like 'TC622%' or part like 'TE943%' or part like 
      'TE953%') 
   or ((part like '%H01%' or description like '%H01%') and product_group in 
      ('LTTU','LTGR','LTPO')))) as "Aluminium", 
-- Steel
(select sum(qty_inv) from ainvdet 
 where inv_account = CUST.account 
 and sales_year = 2021 
 and line_type = 'S' 
 and layout_section = 'D' 
 and qty_inv > 0  
 and ((product_group in ('MCXP','MCXX','MC4G')) 
 OR (product_group like 'IN%' and (part like '%PC3500%' OR part like
    '%PC3600%' OR description like '%PC3500%' OR description like '%PC3600%'))      
 or (part like '%DH406%' or part like '%DH408%' or part like '%DH421%') 
 or (product_group = 'DRUD' and (part like '%PC3500%' or description like 
   '%PC3500%')) 
 or (product_group in ('LTPO','LTGR') and (part like '%NC3220%' or 
    description like '%NC3220%' or part like '%NC3225%' or description like 
    '%NC3225%')) 
 or (product_group = 'LTTU' and (part like '%NC3220%' or description like 
    '%NC3220%' or part like '%NC3225%' or description like '%NC3225%' or part      
    like '%NC3215%' or description like '%NC3215%' or part like '%YG3020%' or 
    description like '%YG3020%')))
) as "Steel"


from customer CUST 
where userchk1 <> true AND  userchk2 <> true AND userchk3 <> true AND 
userchk4 <> true AND userchk5 <> true AND userchk6 <> true AND userchk7 <> 
true AND userchk8 <> true AND userchk9 <> true AND userchk10 <> true

limit 5

我从客户表中获取各个字段,但子查询为所有客户返回相同的值。

我也尝试过使用 GROUP BY customerid 并得到相同的结果,如下所示:

Output Results

(n.b. 限制只是为了让它在测试时运行得更快)

【问题讨论】:

  • 请将您的查询编辑/格式化为一些可读的形式。 [我开始编辑,但对我来说太多了]
  • 已编辑:希望 Wildplasser 读起来更好;抱歉,第一次发帖。
  • 您的查询太大而无法处理。也许条件聚合可以简化它?
  • 我不知道如何精简它或条件聚合是什么;如果它更具可读性,请随意删除很多“或”行。主要问题是为什么它不只返回特定于该客户的数据?
  • 注意:聚合子查询看起来不同:where customerid = CUST.customeri > where inv_account = CUST.account。这是故意的吗?

标签: postgresql subquery


【解决方案1】:

未经测试(显然)


SELECT cu.customerid
        , cu.account
        , cu.name
                -- Aluminium
        , SUM(vd.qty_inv) FILTER(
                WHERE  (vd.product_group LIKE 'IN%' AND (vd.part LIKE '%H01%' OR vd.description LIKE 
                        '%H01%')) 
                        OR (vd.part LIKE 'DCA40%' OR vd.part LIKE 'DCA60%' OR vd.part LIKE 'D5432%' OR vd.part 
                        LIKE 'D5433%' OR vd.part LIKE 'D5434%' OR vd.part LIKE '220392%' OR vd.part LIKE 
                        '220360%' OR vd.part LIKE 'D1106%' OR vd.part LIKE 'DL510%' OR vd.part LIKE 
                        'DL508%' OR vd.part LIKE 'DL509%' OR vd.part LIKE 'DL507%' OR vd.part LIKE 
                        'DT693%' OR vd.part LIKE 'DL608%' OR vd.part LIKE 'DL205%' OR vd.part LIKE 
                        'SPET%' OR vd.part LIKE 'XOET%') 
                        OR ((vd.part LIKE 'E24%' AND (vd.part LIKE '%AL%' OR vd.part LIKE '%AZ%')) OR (vd.part 
                        LIKE 'E25%' AND (vd.part LIKE '%AL%' OR vd.part LIKE '%AZ%')) OR vd.part LIKE 
                        'E70%' OR  vd.part LIKE 'E71%' OR vd.part LIKE 'LANCIA%' OR vd.part LIKE 
                        'TC163%' OR vd.part LIKE 'TC622%' OR vd.part LIKE 'TE943%' OR vd.part LIKE
                        'TE953%') 
                        OR ((vd.part LIKE '%H01%' OR vd.description LIKE '%H01%') AND vd.product_group in 
                        ('LTTU','LTGR','LTPO'))
                ) as "Aluminium"
                -- Steel
        , SUM(vd.qty_inv) FILTER( 
                WHERE (vd.product_group in ('MCXP','MCXX','MC4G')) andor 
                 (vd.product_group LIKE 'IN%' AND (vd.part LIKE '%PC3500%' OR vd.part LIKE
                'PC3600%' OR vd.description LIKE '%PC3500%' OR vd.description LIKE '%PC3600%')) andor     
                 (vd.part LIKE '%DH406%' OR vd.part LIKE '%DH408%' OR vd.part LIKE '%DH421%') andor
                 (vd.product_group = 'DRUD' AND (vd.part LIKE '%PC3500%' OR vd.description LIKE 
                'PC3500%')) andor
                 (vd.product_group in ('LTPO','LTGR') AND (vd.part LIKE '%NC3220%' OR 
                vd.description LIKE '%NC3220%' OR vd.part LIKE '%NC3225%' OR vd.description LIKE 
                'NC3225%')) andor
                 (vd.product_group = 'LTTU' AND (vd.part LIKE '%NC3220%' OR vd.description LIKE 
                'NC3220%' OR vd.part LIKE '%NC3225%' OR vd.description LIKE '%NC3225%' OR vd.part      
                 '%NC3215%' OR vd.description LIKE '%NC3215%' OR vd.part LIKE '%YG3020%' OR 
                vd.description LIKE '%YG3020%'))
                 ) as "Steel" 

FROM customer cu
LEFT JOIN ainvdet vd ON vd.inv_account = cu.account
                AND vd.sales_year = 2021
                AND vd.line_type = 'S'
                AND vd.layout_section = 'D'
                AND vd.qty_inv > 0
WHERE cu.userchk1 <> true AND  cu.userchk2 <> true 
        AND cu.userchk3 <> true AND cu.userchk4 <> true 
         AND cu.userchk5 <> true AND cu.userchk6 <> true 
         AND cu.userchk7 <> true AND cu.userchk8 <> true 
         AND cu.userchk9 <> true AND cu.userchk10 <> true
GROUP BY 1,2,3
        ;

【讨论】:

  • 感谢您的帮助;但是,我在 FILTER 之后的左括号中的两个子查询处或附近都遇到了语法错误。关于导致问题的原因有什么想法吗? (注意,子查询之间的逗号过多,但这不是问题。
  • 没有子查询。过滤条件中的WHERE 是关键字的重用。 (“语法糖”)。好吧:很可能,我犯了一些小错误。可能在某处省略了逗号或表格别名......
  • "Aluminium" 后面多了一个逗号 已修复。
  • 无法深究! :-( 即使我在 WHERE 之后删除了括号内的整个代码,它仍然会给出相同的语法错误
  • 我的第一条评论指出...(注意,子查询之间的逗号太多,但这不是问题
猜你喜欢
  • 1970-01-01
  • 2011-11-08
  • 2021-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
  • 1970-01-01
  • 2013-07-06
  • 2023-04-01
相关资源
最近更新 更多