问题:
| name | 2021-11-01|
| mark | 早班|
| jack | 晚班 |
需求:表格转置为:
| 日期 | 姓名 | 班次 |
| 2021-11-01 | mark| 早班 |
| 2021-11-01| jack| 晚班 |
试着用过excel 预先写好日期利用hlookup和偏移函数转换,但是这样太麻烦了,有没有相对简单的方法?
用的是什么数据库?可以使用pivot 函数实现。
select
t.字段1,t.字段2
(selct 字段1,字段2,sum([单条数据])
from
(select 字段1,字段2
case when '' then '' end as 单条数据
from table with (nolock)
where 条件....
)as t
group by 字段1,字段2
)
首先,日期不能作为字段名,我假设你1号是A1,2号是A2,以此类推。
然后你这个要用unpivot,但要看你是什么数据库,不是所有数据库都支持。
下面这个sql是按照你这个格式虚拟的测试数据及查询sql
---测试数据
create table test_20220119 (name VARCHAR2(100),A1 VARCHAR2(100),A2 VARCHAR2(100),A3 VARCHAR2(100),A4 VARCHAR2(100),A5 VARCHAR2(100),A6 VARCHAR2(100),A7 VARCHAR2(100),A8 VARCHAR2(100),A9 VARCHAR2(100),A10 VARCHAR2(100),A11 VARCHAR2(100),A12 VARCHAR2(100),A13 VARCHAR2(100),A14 VARCHAR2(100),A15 VARCHAR2(100),A16 VARCHAR2(100),A17 VARCHAR2(100),A18 VARCHAR2(100),A19 VARCHAR2(100),A20 VARCHAR2(100),A21 VARCHAR2(100),A22 VARCHAR2(100),A23 VARCHAR2(100),A24 VARCHAR2(100),A25 VARCHAR2(100),A26 VARCHAR2(100),A27 VARCHAR2(100),A28 VARCHAR2(100),A29 VARCHAR2(100),A30 VARCHAR2(100));
INSERT INTO test_20220119 VALUES ('ZS','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C');
INSERT INTO test_20220119 VALUES ('LS','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C','A','B','C');
---查询sql
select name 姓名,substr(日期,2) 日期, 班次 from test_20220119 UNPIVOT (班次 FOR 日期 in (A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28,A29,A30));
实测截图
Excel里写宏吧