简体   繁体   English

如何避免SQL中的子查询重复?

[英]How do I avoid sub-query repetitions in SQL?

I want the Min Price for purpose-A items and Max price for purpose-B items, moreover I group my items by zone. 我想要用途A的最低价格和用途B的最高价格,而且我还按区域对物品进行分组。

SELECT ZONE, MIN_PRICE, MAX_PRICE --,LEFT_ZONE
  FROM 
  (SELECT MIN(PRICE) AS MIN_PRICE , ZONE  AS LEFT_ZONE
    FROM MYTABLE 
    WHERE PURPOSE = 'A'
      AND SOMETHING = 'SOMEVALUE'
    GROUP BY ZONE 
   )
    FULL OUTER JOIN 
  (SELECT MAX(PRICE) AS MAX_PRICE, ZONE_CD  
    FROM MYTABLE 
    WHERE PURPOSE = 'B'
      AND SOMETHING = 'SOMEVALUE'
    GROUP BY ZONE 
   )
  ON LEFT_ZONE = ZONE 

This query gives the output I want, but I don't like it for two reasons: 该查询提供了我想要的输出,但是由于两个原因,我不喜欢它:

1) I want 1)我想要

FROM MYTABLE 
WHERE SOMETHING = 'SOMEVALUE'

to be called only once. 只能被调用一次。

2) I get ZONE null when the row comes from the right table in my full outer join. 2)当行来自我的完整外部联接中的右表时,我得到ZONE null。

How could I fix these problems. 我该如何解决这些问题。

Are there some more issues in my query? 查询中还有其他问题吗?

Have you tried using a CASE expression to get this: 您是否尝试过使用CASE表达式来获取此信息:

select zone,
  min(case when PURPOSE = 'A' then price end) min_price,
  max(case when PURPOSE = 'B' then price end) max_price
from MYTABLE 
where SOMETHING = 'SOMEVALUE'
group by zone

Try this: 尝试这个:

  SELECT 
    ZONE, 
    SUM (CASE WHEN PURPOSE = 'A' THEN MIN(PRICE) ELSE 0 END) AS MIN_PRICE,
    SUM (CASE WHEN PURPOSE = 'B' THEN MAX(PRICE) ELSE 0 END) AS MAX_PRICE
  FROM 
    MYTABLE 
  WHERE 
    SOMETHING = 'SOMEVALUE'
  GROUP BY 
    ZONE 

or any small variation of this 或任何小的变化

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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