按列分组并显示与条件匹配的列的值

时间:2019-04-02 12:45:22

标签: sql sqlite

我必须对GROUP BY列进行分组,如果有一个以上的条目,则需要显示一个满足条件的列。如果只有一个条目,也应该显示它。

ID  |  Name  |  GroupId
 1  |    A   |     x
 2  |    A   |     y
 3  |    B   |     x
 4  |    C   |     z
 5  |    A   |     z
 6  |    B   |     y

Condition: COUNT(GroupId) > 1 then display y

预期结果:

Name  |  GroupId
  A   |     y
  B   |     y
  C   |     z

我发现内部查询的答案。不用内部查询就可以做到吗?

注意:如果一个名称有两个或多个记录,而没有一个记录,则即使没有,也要显示“ x”。

3 个答案:

答案 0 :(得分:1)

与此:

select 
  name,
  case 
    when count(distinct groupid) = 1 then max(groupid)
    when sum(case when groupid = 'y' then 1 end) > 0 then 'y'
    else 'x'
  end groupid   
from tablename
group by name

针对:

CREATE TABLE tablename (
    id  INTEGER PRIMARY KEY AUTOINCREMENT,
    name    TEXT,
    groupid TEXT
);
INSERT INTO tablename (id,name,groupid) VALUES 
 (1,'A','x'),
 (2,'A','y'),
 (3,'B','x'),
 (4,'C','z'),
 (5,'A','z'),
 (6,'B','y'),
 (7,'D','k'),
 (8,'D','m');

结果是:

| name | groupid |
| ---- | ------- |
| A    | y       |
| B    | y       |
| C    | z       |
| D    | x       |

请参见demo

答案 1 :(得分:0)

您可以在下面尝试-

select name, case when count(groupid)>2 then 'y' else min(groupid) end as groupid
from tablename a
group by name

答案 2 :(得分:0)

您描述:

select t.name,
       (case when min(groupid) <> max(groupid)  then 'y'
             else max(groupid)
        end)
from t;

但是我认为你真的想要:

Process process = new ProcessBuilder("C:\\kafka_2.12-2.2.0\\bin\\windows\\zookeeper-server-start.bat",
"C:\\kafka_2.12-2.2.0\\config\\zookeeper.properties").start();
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;

    while ((line = br.readLine()) != null) {
      System.out.println(line);
    }