我有下表和数据
CREATE TABLE arch (
id INT NOT NULL,
arch_number VARCHAR(30) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO arch
(id, arch_number)
VALUES
(1,"AN 50"),
(2,"AN 50/0"),
(3,"AN 50/1"),
(4,"AN 51/0"),
(5,"AN 51/1"),
(6,"AN 52/1"),
(7,"AN 53/2");
我只想选择那些仅斜线后带有数字的arch_number。这意味着在此示例中,我要获取AN 51,AN 52和AN53。应完全忽略AN 50。
我的Sql不能这样工作:
select * from arch where arch_number like '%/%'
这样,我将获得包括AN 50在内的所有AN。但是,在这种情况下,应忽略AN 50,因为id = 1的行中没有斜杠和数字。
我该怎么做?
答案 0 :(得分:2)
这是一种方法:
WITH
compare ([Year], Product, ThisYearClient, PrevYearClient, LoyalClient) AS (
SELECT ISNULL(this.[Year], prev.[Year]+1)
, ISNULL(this.Product, prev.Product)
, this.Client, prev.Client
, CASE WHEN this.Client = prev.Client THEN this.Client ELSE NULL END
FROM tblProductClient this
FULL JOIN tblProductClient prev
ON this.Product = prev.Product
AND this.Client = prev.Client
AND this.[Year] = prev.[Year]+1
),
totals ([Year], Product, ClientsThisYear, ClientsPrevYear, LoyalClients, R) AS (
SELECT [Year], Product
, COUNT(ThisYearClient)
, COUNT(PrevYearClient)
, COUNT(LoyalClient)
, RANK() OVER (ORDER BY [Year] DESC)
FROM compare
GROUP BY [Year], Product
)
SELECT [Year], Product, ClientsThisYear, ClientsPrevYear, LoyalClients
, ClientsThisYear - LoyalClients AS NewClients
, ClientsPrevYear - LoyalClients AS MissingClients
FROM totals WHERE R > 1
ORDER BY [Year], Product
答案 1 :(得分:2)
您可以使用INSTR
函数来获取/
列上arch_number
不存在的行数据,然后使用not exists
子查询来过滤arch_number
不包含/
SELECT *
FROM arch t
WHERE not exists (
select *
from arch t1
where INSTR(t1.arch_number,'/',1,1) = 0
and t.arch_number like '%' || t1.arch_number || '%'
);
sqlfiddle:http://sqlfiddle.com/#!4/c56df/26