行转列
sql架构
CREATE TABLE demo1(
`id` INT,
`store1` INT,
`store2` INT,
`store3` INT
);
INSERT INTO demo1 (id, store1, store2, store3) VALUES (0, 95, 100, 105);
INSERT INTO demo1 (id, store1, store2, store3) VALUES (1, 70, NULL, 80);
select * from demo1
操作:分别查询每行不同列的值取别名后求并集
SELECT id,'store1' AS store ,store1 AS price FROM demo1 WHERE store1 IS NOT NULL
UNION
SELECT id,'store2' AS store, store2 AS price FROM demo1 WHERE store2 IS NOT NULL
UNION
SELECT id, 'store3' AS store, store3 AS price FROM demo1 WHERE store3 IS NOT NULL
列传行
同理
CREATE TABLE demo(
`id` INT,
`store` VARCHAR(10),
price INT
);
INSERT INTO demo VALUES(0,'store1',95);
INSERT INTO demo VALUES(0,'store2',100);
INSERT INTO demo VALUES(0,'store3',105);
INSERT INTO demo VALUES(1,'store1',70);
INSERT INTO demo VALUES(1,'store3',80);
SELECT * FROM demo;
操作,使用group分组并且匹配属性与属性值
SELECT id,
MAX(IF(store='store1',price,NULL)) AS 'store1',
MAX(IF(store='store2',price,NULL)) AS 'store2',
MAX(IF(store='store3',price,NULL)) AS 'store3'
FROM demo
GROUP BY id;
tips:虽然笔者明白使用group操作除了分组使用的字段其他字段都需要使用聚合函数,但是却误以为此时聚合函数不生效,其实是生效的,只不过没有同一id,store的情况下,有多个price的值。此时我再添加在此环境下一个实际上不可能的记录,完成验证。因此,在列传行情况下可以使用不同的聚合函数,sum,min,max都可以,结合需求的需要使用。
INSERT INTO demo VALUES(1,'store3',81);