Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何按分组并选择_Sql_Oracle - Fatal编程技术网

Sql 如何按分组并选择

Sql 如何按分组并选择,sql,oracle,Sql,Oracle,我试着提取a型血的顾客 我想我必须按客户分组,并尝试按类型分组 但我想不出实现这一目标的具体方法。 如果有人有意见,请告诉我 我期望的结果如下 customer type A a A c C a C a 感谢使用exists,我们可以尝试: SELECT t1.customer, t1.type FROM yourTable t1 WHERE EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.cust

我试着提取a型血的顾客

我想我必须按客户分组,并尝试按类型分组

但我想不出实现这一目标的具体方法。 如果有人有意见,请告诉我

我期望的结果如下

customer type
A        a
A        c
C        a
C        a

感谢使用exists,我们可以尝试:

SELECT t1.customer, t1.type
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.customer = t1.customer AND t2.type = 'a');

exists逻辑以简单的英语读取为select any record,对于该记录,我们可以为类型为a的同一客户找到至少一条记录。这意味着保留所有客户记录,其中至少一个记录的类型为a。

使用exists,我们可以尝试:

SELECT t1.customer, t1.type
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.customer = t1.customer AND t2.type = 'a');

exists逻辑以简单的英语读取为select any record,对于该记录,我们可以为类型为a的同一客户找到至少一条记录。这意味着保留所有客户记录,其中至少一个记录的类型为a。

您不需要分组。您只需为类型为“a”的客户筛选表,然后使用该结果集为客户再次筛选表

WITH
    cust_data
    AS
        (SELECT 'A' AS customer, 'a' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'A' AS customer, 'c' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'B' AS customer, 'b' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'B' AS customer, 'c' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'C' AS customer, 'a' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'C' AS customer, 'a' AS TYPE FROM DUAL)
SELECT *
FROM cust_data c
WHERE customer IN (SELECT customer
                   FROM cust_data
                   WHERE TYPE = 'a');
这给

CUSTOMER    TYPE
A           c
A           a
C           a
C           a

你不需要分组。您只需为类型为“a”的客户筛选表,然后使用该结果集为客户再次筛选表

WITH
    cust_data
    AS
        (SELECT 'A' AS customer, 'a' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'A' AS customer, 'c' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'B' AS customer, 'b' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'B' AS customer, 'c' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'C' AS customer, 'a' AS TYPE FROM DUAL
         UNION ALL
         SELECT 'C' AS customer, 'a' AS TYPE FROM DUAL)
SELECT *
FROM cust_data c
WHERE customer IN (SELECT customer
                   FROM cust_data
                   WHERE TYPE = 'a');
这给

CUSTOMER    TYPE
A           c
A           a
C           a
C           a

我希望下面的查询满足您的要求

SELECT 
    *
FROM
    test.customer
WHERE
    customer IN (SELECT 
            customer
        FROM
            test.customer
        WHERE
            type = 'a');
输出:

A   a
A   c
C   a
C   a

我希望下面的查询满足您的要求

SELECT 
    *
FROM
    test.customer
WHERE
    customer IN (SELECT 
            customer
        FROM
            test.customer
        WHERE
            type = 'a');
输出:

A   a
A   c
C   a
C   a

不要使用访问表两次。改用窗口函数

with t(customer, type) as (
select 'A', 'a' from dual union all
select 'A', 'c' from dual union all
select 'B', 'b' from dual union all 
select 'B', 'c' from dual union all
select 'C', 'a' from dual union all
select 'C', 'a' from dual)
select customer, type
from 
   (select t.*, count(decode(type, 'a', 1)) over (partition by customer) cnt
    from t
   )
where cnt > 0;

CUSTOMER TYPE
-------- ----
A        a
A        c
C        a
C        a

不要使用访问表两次。改用窗口函数

with t(customer, type) as (
select 'A', 'a' from dual union all
select 'A', 'c' from dual union all
select 'B', 'b' from dual union all 
select 'B', 'c' from dual union all
select 'C', 'a' from dual union all
select 'C', 'a' from dual)
select customer, type
from 
   (select t.*, count(decode(type, 'a', 1)) over (partition by customer) cnt
    from t
   )
where cnt > 0;

CUSTOMER TYPE
-------- ----
A        a
A        c
C        a
C        a

所以您想要的结果是任何在customer和type列上都有“A”或“A”的行?如果是这样,那么只需:选择customer,从tablename中键入customer='A'或type='A',您要从满足特定条件的表中选择WHERE子句。条件是在表exists子句中存在一个客户特定类型的行。还有其他解决方案,但这是直截了当的方法。请在此处添加要应用的规则或条件。否则你会得到疯狂的猜测和猜测的结果。直截了当地说:使用因果报应当然和存在原因一样直截了当,我甚至更喜欢它的简单性。措辞听起来有点复杂,而查询实际上比带有exists子句的查询要短:条件是客户在具有所需的type in子句的客户集合中。因此,您所需的结果是任何在customer和type列上都有“a”或“a”的行?如果是这样,那么只需:选择customer,从tablename中键入customer='A'或type='A',您要从满足特定条件的表中选择WHERE子句。条件是在表exists子句中存在一个客户特定类型的行。还有其他解决方案,但这是直截了当的方法。请在此处添加要应用的规则或条件。否则你会得到疯狂的猜测和猜测的结果。直截了当地说:使用因果报应当然和存在原因一样直截了当,我甚至更喜欢它的简单性。措辞听起来有点复杂,而查询实际上比带有exists子句的查询要短:条件是客户“在*具有所需类型in子句的客户集合中”。谢谢,我想在子查询中理解其中t2.customer=t1.customer和t2.type='a'为什么这样做很好。。似乎“customer='A'和type='c'将被删除..请检查更新的答案以获得解释。谢谢,我想在子查询中了解其中t2.customer=t1.customer和t2.type='A'为什么这样做很好。。“customer='A'和type='c'似乎将被删除。请检查更新的答案以获取解释。