每行对应每隔一行的SQL

时间:2019-12-16 07:53:02

标签: mysql sql

我有一个像这样的表:

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与之对应的是什么?

2 个答案:

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

您可以在电子表格中生成代码。

请注意,这不会旋转列。甚至可能无法实现,具体取决于原始表中的行数。