我有一张表,包含几年的数据,示例如下:
年 | 价值 | 水果 |
---|---|---|
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年......)?
“不,没有这样的方法”的答案令人悲伤,但无论如何还是值得欢迎的。
提前致谢!
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);