用户在给定年份的总交易量

时间:2021-08-01 16:07:48

标签: sql

我有两个表,分别是学生和反式。在 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');

有人可以帮我解决这个问题吗?如何解决这个问题。

1 个答案:

答案 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