我正在处理一个奇怪的查询,它可能需要在HAVING子句中使用过滤器,但是由于我没有在GROUP BY的HAVING子句中包含我试图过滤的列,所以它不起作用.想知道在SQL本身中是否可以用其他方式来完成这项工作?提亚

For clarification on what I'm trying to do:我需要获取table_id 和CAFICE_NUMBER,表示只提供黑咖啡,但不提供 ‘LATTE’.如果两个都被送达,那么它就不应该被退回.从… 表中位置G中的数据不应作为其唯一返回值 提供服务的拿铁位置H不应作为其服务退回 拿铁加黑咖啡.位置D应仅作为其服务退还 黑色.

我已经把所有的东西都放在SQL Fiddle here元了

在结果中,我希望不显示行

|    44444 |            12 |        G | 

Schema Setup:
create table some_table_test(coffee_id integer, coffee_number integer, coffee_type text);
create table some_table_test_coffee(coffee_id integer, location text);
create table some_table_number(coffee_number integer, table_id integer);

insert into some_table_test (coffee_id, coffee_number, coffee_type)
values (1, 10, 'BLACK'),
       (2, 10, 'BLACK'),
       (3, 11, 'BLACK'),
       (6, 12, 'BLACK'),
       (4, 11, 'LATTE'),
       (7, 12, 'LATTE');

insert into some_table_test_coffee (coffee_id, location)
values (1, 'D'),
       (3, 'H'),
       (2, 'D'),
       (3, 'D'),
       (4, 'H'),
       (7, 'G');

insert into some_table_number (coffee_number, table_id)
values (10, 123456),
       (11, 98764),
       (12, 44444);

Query:

select stn.table_id, st.coffee_number, location
from some_table_test st
         join some_table_test_coffee s on st.coffee_id = s.coffee_id
join some_table_number stn on stn.coffee_number = st.coffee_number
group by location, st.coffee_number, stn.table_id
having count(distinct coffee_type) = 1 -- I need a way to say coffee_type != 'LATTE'

100:

| table_id | coffee_number | location |
|----------|---------------|----------|
|   123456 |            10 |        D |
|    98764 |            11 |        D |
|    44444 |            12 |        G |

推荐答案

虽然没有明确说明,但我将需求理解为"咖啡类型不同于拿铁咖啡的行". 一旦像这样制定,你可以把它翻译成一个case的表达式和count的表达式:

select stn.table_id, st.coffee_number, location
from some_table_test st
         join some_table_test_coffee s on st.coffee_id = s.coffee_id
join some_table_number stn on stn.coffee_number = st.coffee_number
group by location, st.coffee_number, stn.table_id
having COUNT(CASE coffee_type WHEN 'LATTE' THEN NULL ELSE 1 END) > 0

SQLFiddle demo

Sql相关问答推荐

如何将varchar传递给tvf并使用该参数来查询结果SQL服务器

当一个视图在Postgres中失效时?

如何在PostgreSQL中的一列中添加两个文本?

IF NOT EXISTS子查询的性能瓶颈

以一致的价值获得独特的价值

SQL到Snowflake-转换嵌套的SELECT(值

用VB.NET在Dapper中实现MS Access数据库顺序透视

如何在T-SQL中编写row_number的WHERE子句?

插入具有预期逻辑的查询以Forking 表

SQL 查询是否返回列表中仅包含某些值而不包含其他值的行?

SQL 搜索 - 获取最大值日期的奇怪行为

SQL Server - 复杂场景 - 比较状态并填充值到后续行

如何将输出转换为二维格式?

带有数组输入参数的Snowflake UDF优化

根据是否存在值组合分组并 Select 行

计算 PostgreSQL 中的平均会话长度

使用 R 遍历 SQL 查询,每次替换一个变量

如何使用 pg-promise 创建要在复杂的 sql 查询中使用的 VALUES 列表?

如何根据另一列对行值进行分组?

如何在 Trino/Presto 中过滤掉 map 中的某些键?