在 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 |
+----------+------+-------+
数据库结构要复杂得多,不幸的是我无法更改它。
EDIT:该溶液不应使用foo
and bar
作为查询中的硬编码值。
对于 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)