将行值显示为 SQL 中的列值

Displaying row values as column values in SQL

我在 SQL(XAMP)

中有这个 table
item_name         category_name        category_id
----------------------------------------------------
Flash_disk        Accessories          1    
Fanta             Food                 2    
Printer           Accessories          1    
Sprite             Food                2    

我正在尝试使用此查询将 category_name 列值显示为列值,它显示得非常好,如图所示。 sql:

SELECT category_id, MAX(IF(`category_name` = "Food", item_name, NULL)) Food, MAX(IF(`category_name` = "Accessories", item_name, NULL)) Accessories
FROM categories
GROUP BY category_id

结果是

category_id         Food           Accessories
---------------------------------------------------
1                   NULL            Printer
2                   Sprite           NULL
---------------------------------------------------

有没有一种方法可以让所有列都填充值而不是显示空值 结果是这样的:

category_id         Food           Accessories
---------------------------------------------------
1                   Fanta          Printer
2                   Sprite         Flash_disk   
---------------------------------------------------

你可以使用 coalesce():

SELECT category_id,
       COALESCE(MAX(CASE WHEN `category_name` = 'Food' THEN  item_name END), 'Fanta') as Food, 
       COALESCE(MAX(CASE WHEN `category_name` = 'Accessories' THEN  item_name END), 'Flash_disk') as Accessories
FROM categories
GROUP BY category_id;

预期的结果没有多大意义。

例如,根据这些结果,芬达为什么会有 category_id 1?

但是这个查询几乎得到相似的结果:

SELECT rownum, 
MAX(CASE WHEN category_name = 'Food' THEN item_name END) AS Food, 
MAX(CASE WHEN category_name = 'Accessories' THEN item_name END) AS Accessories
FROM
(
    SELECT 
    MAX(cat1.category_name) AS category_name,
    COUNT(*) AS rownum,
    cat1.item_name
    FROM categories cat1
    JOIN categories cat2 ON cat2.category_id = cat1.category_id 
     AND cat2.item_name <= cat1.item_name
    GROUP BY cat1.category_id, cat1.item_name
) q
GROUP BY rownum
ORDER BY rownum;

Returns

rownum  Food    Accessories
1       Fanta   Flash_disk
2       Sprite  Printer