单列从几行到一条记录中的几列,但允许行中有NULL

Single columns from several rows into several columns in one record, but allow NULL in the rows

我正在尝试将多条记录中的单行合并到一条记录中的多列中。

假设我们有一个人员数据库,他们都选择了 2 个号码。但是,有些人只选择了第一个号码,而没有提交第二个号码。

这是一个简化的示例,在我的实际生产数据库中,它已扩展到其中的几个 'numbers'。

在这个例子中,第 3 个人还没有选择他们的第二个号码。

我试过这个查询:

SELECT ppl.*,
       cn1.chosen_num AS first_num,
       cn2.chosen_num AS second_num

  FROM people AS ppl
       LEFT JOIN
       chosenNumbers AS cn1
       LEFT JOIN
       chosenNumbers AS cn2

 WHERE ppl.numid = cn1.personid
   AND ppl.numid = cn2.personid
   
   AND cn1.type = 'first'
   AND cn2.type = 'second'

但它 return 没有关于 Person3 的任何信息,因为他们还没有选择第二个号码。但是,我想要参与这个数字猜测的每个人的数据,但我希望能够看到他们猜到的第一个和第二个数字。

这是我正在测试的示例数据库的转储。

BEGIN TRANSACTION;
CREATE TABLE people (numid INTEGER PRIMARY KEY, name TEXT);
INSERT INTO people VALUES(1,'Person1');
INSERT INTO people VALUES(2,'Person2');
INSERT INTO people VALUES(3,'Person3');
CREATE TABLE chosenNumbers (numid INTEGER PRIMARY KEY, chosen_num INTEGER, type TEXT, personid INTEGER, FOREIGN KEY(personid) REFERENCES people(numid));
INSERT INTO chosenNumbers VALUES(1,101,'first',1);
INSERT INTO chosenNumbers VALUES(2,102,'second',1);
INSERT INTO chosenNumbers VALUES(3,201,'first',2);
INSERT INTO chosenNumbers VALUES(4,202,'second',2);

-- Person 3 hasn't chosen their 2nd number yet..
-- But I want data on them, and the query above
-- doesn't work.
INSERT INTO chosenNumbers VALUES(5,301,'first',3);
COMMIT;

如果有人告诉我如何将其扩大到 3 个数字或 4 个数字,甚至更多,我也很高兴。

您可以使用条件聚合:

SELECT p.*,
       MAX(CASE WHEN c.type = 'first' THEN c.chosen_num END) AS first_num,
       MAX(CASE WHEN c.type = 'second' THEN c.chosen_num END) AS second_num
FROM people AS p LEFT JOIN chosenNumbers AS c
ON p.numid = c.personid
GROUP BY p.numid;

您可以扩展更多列的代码。

参见demo