如何在 SQL Server 中格式化输出表?
Posted
技术标签:
【中文标题】如何在 SQL Server 中格式化输出表?【英文标题】:How can I format an output table in SQL Server? 【发布时间】:2018-01-30 13:46:20 【问题描述】:运行此查询后
SELECT Title ,
CASE WHEN fieldName = 'Supplier Name' THEN fieldvalue
END AS 'Supplier Name',
CASE WHEN fieldname = 'Legal Agreement Name' THEN fieldValue
END AS 'Legal Agreement Name'
FROM PCM_MultiItems_Metadata
WHERE PROFILEID =254
and fieldname in ('Creator Contact Name','Supplier Name','Legal Agreement Name');
我来了
我在 sql server 中为不同资产的不同属性生成了这张表
我怎样才能在 sql 中格式化这个表,以便我得到表,例如 Title 成为我的第一列,Supplier Name 和 Legal Name 分别是我的第二列和第三列
生成该表的我的 sql 查询是
SELECT Title, FieldName, Fieldvalue
from PCM_MultiItems_Metadata
WHERE PROFILEID =254
and fieldname in ('Creator Contact Name','Supplier Name','Legal Agreement Name');
我想要一个输出,例如
Title | Supplier Name | Legal Agreement Name
231457 Bay VALLEY IMAGE AND DIGITAL AGREEMENT
232058 BUCKHEAD MEAT;NEWPORT MEAT SYSCO MEAT BRAND GUDILINE
【问题讨论】:
以你想要的方式创建新表,在其中插入数据,删除旧表 ***.com/questions/1605144/… @SQL_M这里不是这样,他希望列内的数据成为列 @WhatsThePoint 还不清楚 @Sami 我不是说这里的问题不是太宽泛,我只是说它不是骗子 【参考方案1】:您可以尝试以下方法:
SELECT Title ,
CASE WHEN fieldName = 'Supplier Name' THEN fieldvalue
END AS 'Supplier Name',
CASE WHEN fieldname = 'Legal Agreement Name' THEN fieldValue
END AS 'Legal Agreement Name'
FROM PCM_MultiItems_Metadata
WHERE PROFILEID =254
and fieldname in ('Creator Contact Name','Supplier Name','Legal Agreement Name');
【讨论】:
谢谢你。它给了我 2 行相同的标题号。 选择后添加DISTINCT关键字,应该可以解决重复问题。 它仍然不起作用。它仍然给我 2 行相同的标题。你能看到我上面的截图吗? 您在正确的道路上,但您需要聚合才能使其正常工作。看我的回答。【参考方案2】:使用条件聚合你可以做这样的事情。
select Title
, max(case when FieldName = 'Creator Contact Name' then FieldValue end) as CreatorContactName
, max(case when FieldName = 'Supplier Name' then FieldValue end) as SupplierName
, max(case when FieldName = 'Legal Agreement Name' then FieldValue end) as LegalAgreementName
from PCM_MultiItems_Metadata
WHERE PROFILEID = 254
and fieldname in ('Creator Contact Name','Supplier Name','Legal Agreement Name')
group by Title
【讨论】:
感谢它在 ssms 上运行良好。在 s-s-rs 上运行它以生成报告时出现错误。错误是“无法为查询创建字段列表。验证您可以连接到数据源并且您的查询语法正确”。已添加具有相同密钥的项目" 当您的查询中有多个具有相同名称的列时会发生该错误。报告中的每一列都必须是唯一的,但在 SSMS 的查询中它不必是唯一的。【参考方案3】:试试这个:
SELECT DISTINCT
t1.Title,
t1.FieldValue as [Supplier Name],
t2.FieldValue as [Legal Agreement Name]
FROM PCM_MultiItems_Metadata t1
INNER JOIN PCM_MultiItems_Metadata t2 on t2.Title= t1.Title
WHERE t1.FieldName = 'Supplier Name'
AND t2.FieldName = 'Legal Agreement Name'
这将适用于您提供的源数据的有限快照。如果FieldName
有其他列或值,则需要相应调整。
编辑
调整后举例说明如何使用FieldName
的更多值。
SELECT DISTINCT
t1.Title,
t1.FieldValue as [Supplier Name],
t2.FieldValue as [Legal Agreement Name],
t3.FieldValue as [Field 3],
t4.FieldValue as [Field 4],
FROM PCM_MultiItems_Metadata t1
INNER JOIN PCM_MultiItems_Metadata t2 on t2.Title= t1.Title
INNER JOIN PCM_MultiItems_Metadata t3 on t3.Title= t1.Title
INNER JOIN PCM_MultiItems_Metadata t4 on t4.Title= t1.Title
WHERE t1.FieldName = 'Supplier Name'
AND t2.FieldName = 'Legal Agreement Name'
AND t3.FieldName = 'Field 3',
AND t4.FieldName = 'Field 4'
这是基于FieldName
的一组静态值的静态解决方案。
【讨论】:
谢谢。它适用于这 2 个字段名称,但我有 15-20 个字段名称。我怎样才能做到这一点 ?所以最终我们现在看到的是 15 -20 列而不是 2 列 使用这种方法,您需要添加额外的 JOINS 并扩展 WHERE 子句。 谢谢它的工作。现在我如何将它用于动态值集。在我上面给出的示例中,它基于特定的配置文件。在上面的示例中,它是配置文件 254。现在如何将它用于其他配置文件? 这已经返回所有配置文件的数据。您只需将PROFILEID
添加到 SELECT 即可查看结果中的配置文件。或添加到 WHERE 子句以过滤特定配置文件。
这可行,但效率远低于条件聚合,因为您必须一遍又一遍地读取同一行。以上是关于如何在 SQL Server 中格式化输出表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server Management Studio 中以“真实”CSV 格式获取导出输出?
SQL Server 如何使用 WHILE 查询从多个结果中输出一个表结果