我有两个表,分别是学生和反式。在 trans 表中,我有两列(transid,ide)。在学生表中,我有三列(id、name、gender)。 transid 的前两个字符代表它发生的年份,例如 (18000391)->2018,(19008978)->2019.Table trans 是这样的:
trans_id|ide
190000678|1
200000453|2
180089376|1
190904988|2
183867647|1
表学生具有以下价值:
id|name|gender
1|John|M
2|Mary|F
我想计算特定年份特定人的交易总数。示例输出应采用这种形式,其中列是 (name,2018,2019,2020)。
name|2018|2019|2020
John|2|1|0
Mary|0|1|1
我的解决方案是:
WITH transcations AS (
SELECT
f.('20')||(SUBSTR(trans_id),1,2),
f.ide,
g.id,
g.name,
g.gender
FROM
db.trans f
INNER JOIN db.students g
ON f.ide = g.id
)
SELECT *
FROM transcations
PIVOT(MAX(ID) FOR CATEGORY IN (2018, 2019, 2020) ) P
GROUP BY ID;
请在下面找到示例创建表查询并插入:
-- create a table
CREATE TABLE students (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
gender TEXT NOT NULL
);
CREATE TABLE trans (
trans_id INTEGER,
ide INTEGER FOREIGN KEY
);
-- insert some values
INSERT INTO trans VALUES (1800034,1);
INSERT INTO trans VALUES (2000012,2);
INSERT INTO trans VALUES (1900092,1);
INSERT INTO trans VALUES (2000000,1);
INSERT INTO trans VALUES (1800904,1);
-- insert some values
INSERT INTO students VALUES (1,'John','M');
INSERT INTO students VALUES (2,'Mary','F');
有人可以帮我解决这个问题吗?如何解决这个问题。
答案 0 :(得分:1)
您可以使用条件聚合:
select s.name,
sum(case when cast(trans_id as varchar(255)) like '18%' then 1 else 0 end) as cnt_2018,
sum(case when cast(trans_id as varchar(255)) like '19%' then 1 else 0 end) as cnt_2019,
sum(case when cast(trans_id as varchar(255)) like '20%' then 1 else 0 end) as cnt_2020
from students s join
trans t
on t.ide = s.id
group by s.id, s.name