“一年一列”表的简洁 SQL 查询

问题描述 投票:0回答:1

我有一张表,包含几年的数据,示例如下:

价值 水果
2021 101 苹果
2021 102 香蕉
2021 103 梨子
2021 104 覆盆子
2021 105 草莓
2022 201 苹果
2022 202 香蕉
2022 203 梨子
2022 204 覆盆子
2022 205 草莓
2023 301 苹果
2023 302 香蕉
2023 303 梨子
2023 304 覆盆子
2023 305 草莓
2024 401 苹果
2024 402 香蕉
2024 403 梨子
2024 404 覆盆子
2024 405 草莓

我需要一个一年一列表,如下所示:

2021 2022 2023 2024 水果
101 201 301 401 苹果
102 202 302 402 香蕉
103 203 303 403 梨子
104 204 304 404 覆盆子
105 205 305 405 草莓

我在输出表中使用了尽可能多的 JOIN 和 WHERE,如下所示:

SELECT fruits21.value as '2021'
    , fruits22.value as '2022'
    , fruits23.value as '2023'
    , fruits24.value as '2024'
    , fruits21.fruit

FROM fruits as fruits21
JOIN fruits as fruits22 ON fruits22.fruit = fruits21.fruit
JOIN fruits as fruits23 ON fruits23.fruit = fruits21.fruit
JOIN fruits as fruits24 ON fruits24.fruit = fruits21.fruit

WHERE fruits21.year = 2021
    AND fruits22.year = 2022
    AND fruits23.year = 2023
    AND fruits24.year = 2024

是否有任何其他漂亮且简短的sql查询来获取输出表而不使用许多JOIN和WHERE(因为可能有100年......)?

“不,没有这样的方法”的答案令人悲伤,但无论如何还是值得欢迎的。

提前致谢!

sql sqlite join where-clause
1个回答
0
投票
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT DISTINCT ', MAX(CASE WHEN year = ' + CAST(year AS NVARCHAR(4)) + ' THEN value END) AS ''' + CAST(year AS NVARCHAR(4)) + ''''
            FROM fruits
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)'), 1, 2, '');

SET @query = 'SELECT ' + @cols + ', fruit
              FROM fruits
              GROUP BY fruit';

EXECUTE(@query);

演示:https://dbfiddle.uk/rIFJuUzy

© www.soinside.com 2019 - 2024. All rights reserved.