gpt4 book ai didi

sql - 使用 sql 选择的值作为另一个选择的行名

转载 作者:行者123 更新时间:2023-12-04 22:25:04 25 4
gpt4 key购买 nike

在 MSSQL 服务器上,给定表:

TABLE values {
int id;
timestamp date;
int value;
}

TABLE value_type {
int value_id; // foreign key on values.id
text name;
}

我可以发出这样的查询:

SELECT date, name, value
FROM values
LEFT JOIN value_type ON value_id = id;

得到类似的东西:

+----------+------+-------+
| date | name | value |
+----------+------+-------+
| 01.01.10 | foo | 1.0 |
+----------+------+-------+
| 01.01.10 | bar | 2.0 |
+----------+------+-------+
| 02.01.10 | bar | 4.0 |
+----------+------+-------+
| 03.01.10 | foo | 5.0 |
+----------+------+-------+

如果我想获取这样的数据,查询数据库的最有效方法是什么?

+----------+------+-------+
| date | foo | bar |
+----------+------+-------+
| 01.01.10 | 1.0 | 2.0 |
+----------+------+-------+
| 02.01.10 | NULL | 4.0 |
+----------+------+-------+
| 03.01.10 | 5.0 | NULL |
+----------+------+-------+

数据库结构要复杂得多,不幸的是我不能改变它。

编辑:该解决方案不应使用 foobar 作为查询中的硬编码值。

最佳答案

对于 SQL Server 2005+,您可以使用动态 SQL 和 PIVOT

DECLARE @ValuesNames NVARCHAR(4000), @Query NVARCHAR(MAX)
SET @ValuesNames = ''

SELECT @ValuesNames = @ValuesNames + QUOTENAME([name]) + ','
FROM [values] A
INNER JOIN value_type B
ON B.value_id = A.id
GROUP BY [name]
ORDER BY [name]

SET @ValuesNames = LEFT(@ValuesNames,LEN(@ValuesNames)-1)

SET @Query = '
SELECT [date], '+@ValuesNames+'
FROM ( SELECT [date], [name], value
FROM [values]
LEFT JOIN value_type ON value_id = id) A
PIVOT(SUM(value) FOR [name] IN ('+@ValuesNames+')) AS PT
'
EXEC sp_executesql @Query

关于sql - 使用 sql 选择的值作为另一个选择的行名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com