Sql 如何使用having子句获取两列

Sql 如何使用having子句获取两列,sql,Sql,我的数据表是: code -------- ABCD0000 AAAA0000 BBBB0000 CCCC0000 DDDD0001 假设我要查找具有相同端点编号的代码列表等于4, 它应该会回来 substring|substring ---------|--------- ABCD 0000 AAAA 0000 BBBB 0000 CCCC 0000 我的sql代码是 SELECT SUBSTRING(subjects.code ,5, 8), S

我的数据表是:

code
--------
ABCD0000
AAAA0000
BBBB0000
CCCC0000
DDDD0001
假设我要查找具有相同端点编号的代码列表等于4, 它应该会回来

substring|substring
---------|--------- 
ABCD      0000
AAAA      0000
BBBB      0000
CCCC      0000
我的sql代码是

SELECT SUBSTRING(subjects.code ,5, 8), SUBSTRING(subjects.code ,1, 4)
FROM subjects
HAVING count(SUBSTRING(subjects.code ,5, 8)) = 8;
它引起的错误如下:

列“subjects.code”必须出现在GROUP BY子句中,或在聚合函数中使用


但是如果我将其添加到查询中,它将不返回任何内容

我想您需要这样的内容():

创建并填充表格:

CREATE TABLE subjects
(
  code VARCHAR (20) NOT NULL
);

INSERT INTO subjects VALUES ('ABCD0000'), ('AAAA0000'), ('BBBB0000'), ('CCCC0000'), ('DDDD0001');
然后运行premialSQL:

SELECT 
  SUBSTRING (code, 5, 8) AS codes4, 
  COUNT(SUBSTRING (code, 5, 8)) AS cnt
FROM subjects
GROUP BY codes4
HAVING  COUNT(SUBSTRING (code, 5, 8)) = 4
结果:

codes4  cnt
  0000    4
prefix  codes4
  ABCD    0000
  AAAA    0000
  BBBB    0000
  CCCC    0000
然后
JOIN
将此结果返回到原始表:

SELECT 
  SUBSTRING (code, 1, 4) AS prefix,
  SUBSTRING (code, 5, 8) AS codes4
FROM subjects s
JOIN
(
  SELECT 
    SUBSTRING (code, 5, 8) AS codes4, COUNT(SUBSTRING (code, 5, 8)) AS cnt
  FROM subjects
  GROUP BY codes4
  HAVING  COUNT(SUBSTRING (code, 5, 8)) = 4
) AS t 
ON SUBSTRING(s.code, 5, 8) = t.codes4;
结果:

codes4  cnt
  0000    4
prefix  codes4
  ABCD    0000
  AAAA    0000
  BBBB    0000
  CCCC    0000
瞧!p、 欢迎来到论坛!:-)

使用


如果RDBMS支持窗口函数,则无需加入即可完成此操作。只需在子查询中进行窗口计数,然后在外部查询中进行筛选:

select prefix, code
from (
    select
        substring (code, 1, 4) prefix,
        substring (code, 5, 8) code,
        count(*) over(partition by substring(code, 5, 8)) cnt
    from mytable
) t
where cnt = 4

prefix | code :----- | :--- ABCD | 0000 AAAA | 0000 BBBB | 0000 CCCC | 0000 前缀代码 :----- | :--- ABCD | 0000 AAAA | 0000 BBBB | 0000 中交| 0000
之前添加
GROUP BY
子句,使
具有与
SELECT
相同的列。它仍然不返回任何内容,substring | substring-----------+-------------(0行)您使用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请查看您正在使用的数据库产品的详细信息