如何在SQL Server中将资产属性查询结果格式化为指定列结构?
解决SQL Server中行转列的需求
你现在需要把PCM_MultiItems_Metadata表中同一Title的不同属性值合并到同一行,这是典型的行转列场景。你之前的CASE表达式已经迈出了第一步,但因为没有聚合和分组,会产生多行数据,我们可以通过GROUP BY配合聚合函数来实现目标格式:
SELECT Title, MAX(CASE WHEN fieldName = 'Supplier Name' THEN fieldvalue END) AS 'Supplier Name', MAX(CASE WHEN fieldname = 'Legal Agreement Name' THEN fieldValue END) AS 'Legal Agreement Name' FROM PCM_MultiItems_Metadata WHERE PROFILEID =254 AND fieldname IN ('Supplier Name','Legal Agreement Name') -- 这里可以去掉Creator Contact Name,因为你不需要它的列 GROUP BY Title;
为什么这么做?
MAX()聚合函数会忽略NULL值,所以对于每个Title,它会提取出对应属性的非空值GROUP BY Title确保每个Title只返回一行结果,把同一标题的多行属性合并到一行
预期输出示例:
| Title | Supplier Name | Legal Agreement Name |
|---|---|---|
| 231457 | Bay VALLEY IMAGE AND DIGITAL AGREEMENT | |
| 232058 | BUCKHEAD MEAT;NEWPORT MEAT | SYSCO MEAT BRAND GUIDELINE |
如果你的数据中同一Title对应多个相同属性的值(比如同一个Title有多个Supplier Name),MAX()会取最大的那个值;如果需要把多个值拼接起来,可以用STRING_AGG()(SQL Server 2017及以上版本),比如:
SELECT Title, STRING_AGG(CASE WHEN fieldName = 'Supplier Name' THEN fieldvalue END, ';') AS 'Supplier Name', STRING_AGG(CASE WHEN fieldname = 'Legal Agreement Name' THEN fieldValue END, ';') AS 'Legal Agreement Name' FROM PCM_MultiItems_Metadata WHERE PROFILEID =254 AND fieldname IN ('Supplier Name','Legal Agreement Name') GROUP BY Title;
这样就能把同一Title的多个属性值用分号拼接起来,更贴合你示例中的格式。
内容的提问来源于stack exchange,提问作者Karan Neginhal
相关产品推荐
相关产品推荐

