如何在 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中 将日期格式化

sqlserver如何实现两个表的组合输出?

如何在 SQL Server Management Studio 中以“真实”CSV 格式获取导出输出?

SQL Server 如何使用 WHILE 查询从多个结果中输出一个表结果

SQL 问题 - 如何在 SQL Server 中使用迭代日期逻辑进行输出

在sql server中格式化日期输出[重复]