如何在 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 中格式化输出表?的主要内容,如果未能解决你的问题,请参考以下文章