分组后转置

分组后转置

【问题】

i need help with this i try to think about resolve this but i cant find how resolve with mysql, I need if the users have record in the week, and show this result with this form:

user 1 user 2 user 3
week 1 yes no yes
week 2 yes yes no
week 3 yes no yes
week 4 no yes yes
week 5 yes no no
week 6 yes no yes

I have table user and table record

TABLES FIELDS
user id
name
record id_user
date

【回答】

提问者告诉我们有两个表:一是用户表,二是活动记录表。后者表示用户在某日存在一条某活动的记录。问题是如何表示出用户每周是否有活动的记录,并以问题开头的样式表达出来:有记录就标记为 yes,没有就是 no。

SQL 中虽然可以静态列转置,但此问题不是统计问题,一个用户会有多个日期记录,转置不能满足我们的要求;再加上需要动态将日期转化为周序号作为条件来判断,不能轻松地用 SQL 来实现查询。用 SPL 解决这个问题可以这样做:

A
1 =connect("test")
2 =A1.query("select user.name,record.date,record.id_user from user, record where record.id_user=user.id").run(date=interval@w("2018-11-1",date)+1)
3 =A2.group(id_user)
4 =A3.max(date).new(~:week,${A3.("\"No\":"+name).concat@c()})
5 =A3.run(~.run(A4(date).field(A3.#+1,"Yes")))

A1: 连接 test 数据库。

A2:查询 user 表和 record 表,将用户名和日期对应起来。将日期翻译成乘对应的周序号。

A3:根据用户 id 分组。每一组都是改组对应用户的”用户名”和“日期记录”的序列。

A4:根据 A2 找到最大周序号,并生成一个序表,含有周序号列和用户名列,用户名列的数量是根据 A3 的分组动态生成的。初始设定所有用户名列的值为“No”。

A5:根据 A3 的每组每条数据计算其在 A4 中对应的周序号——即对应 A4 第 n 条数据,用 A4(n) 取得该条目,替换其 A3 当前这个用户的值为”Yes”。

最终我们在 A4 格看到要求的结果。

A2

imagepng

A3

imagepng

A4

imagepng

A4 结果

imagepng