过滤不在选择中的列值

Posted

技术标签:

【中文标题】过滤不在选择中的列值【英文标题】:Filter on column values not in select 【发布时间】:2018-11-26 21:46:49 【问题描述】:

我正在尝试对两个表进行连接并筛选不在我的 select 语句中的值。

以下查询不起作用。

select b.[[Product]].[Major Category]]] ,sum(a.BIC_ZCDP) from TEMP_FORECAST_ALL a
join OUT_Dimension_DP_Product b
on right(a.MATERIAL,10) = b.[[Product]].[10D]]]  
join OUT_Dimension_DP_Market c
on a.BIC_ZRMARKET =  c.[[Market]].[Market]]]
group by b.[[Product]].[Major Category]]]
having a.CALMONTH in ('201810','201811','201812') and c.[[Market]].[Region]]] = 'UK'

我收到以下错误

消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的“TEMP_FORECAST_ALL.CALMONTH”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的“TEMP_FORECAST_ALL.CALMONTH”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的“TEMP_FORECAST_ALL.CALMONTH”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

消息 8121,第 16 级,状态 1,第 7 行 HAVING 子句中的列 'OUT_Dimension_DP_Market.[Market].[Region]' 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

我不想在我的 group by 子句中添加 Region 和 CALMONTH。

【问题讨论】:

稍微绕道,但您可能应该阅读一些内容。 sqlblog.org/2009/10/08/… 【参考方案1】:

使用WHERE 子句。 . . :

select p.[[Product]].[Major Category]]], sum(a.BIC_ZCDP)
from TEMP_FORECAST_ALL a join 
     OUT_Dimension_DP_Product p
     on right(a.MATERIAL,10) = b.[[Product]].[10D]]] join
     OUT_Dimension_DP_Market m
     on a.BIC_ZRMARKET = m.[[Market]].[Market]]]
where a.CALMONTH in ('201810', '201811', '201812') and
      m.[[Market]].[Region]]] = 'UK'
group by p.[[Product]].[Major Category]]];

【讨论】:

【参考方案2】:

having 仅用于聚合。由于这只是简单的比较,因此您希望它们在 where 子句中。例如,如果您要与 sum 或其他聚合进行比较,您会使用 having

【讨论】:

【参考方案3】:

Having子句在我们使用聚合函数时使用,但这里你只是做比较,所以你必须使用where子句。

【讨论】:

【参考方案4】:

当您过滤聚合数据时使用 HAVING 子句,即,如果您想过滤 SUM 语句的结果,如下所示: HAVING SUM(a.BIC_ZCDP) > 0

但是,出于查询的目的,您只需将HAVING 切换为WHERE,这样...

SELECT
    b.[[Product]].[Major Category]]],
    SUM(a.BIC_ZCDP) 

FROM
    TEMP_FORECAST_ALL a
        INNER JOIN OUT_Dimension_DP_Product b ON right(a.MATERIAL,10) = b.[[Product]].[10D]]]
        INNER JOIN OUT_Dimension_DP_Market c ON a.BIC_ZRMARKET =  c.[[Market]].[Market]]]

WHERE
    (a.CALMONTH IN ('201810','201811','201812')) AND (c.[[Market]].[Region]]] = 'UK')

GROUP BY
    b.[[Product]].[Major Category]]]

同样,HAVING 子句允许您过滤已为 AGGREGATED (SUM, MAX, MIN, etc.) 的字段,而 WHERE 子句允许您过滤普通字段。

【讨论】:

以上是关于过滤不在选择中的列值的主要内容,如果未能解决你的问题,请参考以下文章

如何从SQL中的列值中提取特定部分(Redshift平台)

根据 C#2.0 中的列值过滤 DataTable 行

根据火花数据框scala中的列值过滤行

按 R 中的列值过滤列表中的每个数据框

将包含列表的记录值与 Postgres 中的列值进行比较

从 Kentico 10 中的自定义表重复器中过滤重复的列值