我有一个像这样的表:
Name day1 day2 day3 day4 day5
charles 1 0 0 1 1
bob 1 1 1 0 0
tom 0 0 0 1 1
约束:列数约为1000 我想要像这样的输出:
charles bob tom
charles 3 1 2
bob 1 3 0
tom 2 0 2
即两者之间共有的1的数目。 sql与之对应的是什么?
答案 0 :(得分:2)
标准化的架构可能看起来像这样...
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(name VARCHAR(12) NOT NULL
,day INT NOT NULL
,PRIMARY KEY(name,day)
);
INSERT INTO my_table VALUES
('charles' , 1),
('bob' , 1),
('bob' , 2),
('bob' , 3),
('charles' , 4),
('tom' , 4),
('charles' , 5),
('tom' , 5);
您的查询将如下所示...
SELECT x.name
, y.name
, COUNT(*) total
FROM my_table x
JOIN my_table y
ON y.name < x.name
AND y.day = x.day
GROUP
BY x.name
, y.name;
+---------+---------+-------+
| name | name | total |
+---------+---------+-------+
| charles | bob | 1 |
| tom | charles | 2 |
+---------+---------+-------+
...并且剩下的问题是显示问题,最好在应用程序代码中解决。
答案 1 :(得分:0)
对此您有一个可怕的模式-正如Strawberry指出的那样。
您基本上会遇到这样的查询:
—-link
您可以在电子表格中生成代码。
请注意,这不会旋转列。甚至可能无法实现,具体取决于原始表中的行数。