如何使用具有having子句的两列

问题描述 投票:0回答:1

我的数据表是:

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子句中或在聚合函数中使用

但是如果我在查询中添加了它,则不返回任何内容

sql
1个回答
1
投票

我认为您想要这样的东西[fiddle ::

创建并填充表格:

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

INSERT INTO subjects VALUES ('ABCD0000'), ('AAAA0000'), ('BBBB0000'), ('CCCC0000'), ('DDDD0001');

然后运行初步 SQL:

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

然后将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;

结果:

prefix  codes4
  ABCD    0000
  AAAA    0000
  BBBB    0000
  CCCC    0000

等等! ps。欢迎来到论坛! :-)


0
投票

使用CTE

;with cte as
(
    Select SUBSTRING(code ,5, 8) as substring1, SUBSTRING(code ,1, 4) as substring2 from subjects
)
SELECT * FROM cte group by substring1,substring2 having COUNT(substring1)=8;
© www.soinside.com 2019 - 2024. All rights reserved.