Sql 将行显示为列
这是我的SQL表:Sql 将行显示为列,sql,sql-server,pivot,coalesce,Sql,Sql Server,Pivot,Coalesce,这是我的SQL表: Table1 Col1 Col2 a 1 a 2 a 3 b 1 c 1 c 2 如何查询此表以这样显示 col1,value1,value2,value3 a,1,2,3 b,1,null,null c,1,2,null col1中的每个值永远不会有超过5条记录。我不知道col2中的值是什么,它们将是动态的。数据库不太擅长执行您要求的操作。虽然我相信这是可能的,而且有人会在这里发布解决方案,但也许你可以通过
Table1
Col1 Col2
a 1
a 2
a 3
b 1
c 1
c 2
如何查询此表以这样显示
col1,value1,value2,value3
a,1,2,3
b,1,null,null
c,1,2,null
col1中的每个值永远不会有超过5条记录。我不知道col2中的值是什么,它们将是动态的。数据库不太擅长执行您要求的操作。虽然我相信这是可能的,而且有人会在这里发布解决方案,但也许你可以通过一个小bash脚本让你的生活更轻松 此代码获取列1中所有唯一值的列表。然后,它查询表中第1列中给定值的第2列中的所有值。“tr”命令用逗号替换换行符,sed命令将最后一个逗号切换回换行符 我觉得如果你发布更多关于你的问题的信息,可能会有更好的解决方法。任何纯查询解决方案都需要将表链接到自身5次,这可能需要大量处理,具体取决于表的大小 注意:我做了一些假设,因为问题没有细节。我假设我们正在使用postgresql,并且该数据库称为test
#!/bin/bash
echo "select distinct col1 from table1 order by col1" | psql -At test | while read col1;do
echo -n "$col1,"
echo "select col2 from table1 where col1='$col1' order by col2" | psql -At test | tr '\n' ',' | sed s/,$/\n/'
done
然后输出为:
a,1,2,3
b,1
c,1,2
如果您使用的是SQL 2005或更高版本,PIVOT是一个不错的选择。 对于静态查询,可以假设最大值数为1、2、3。。。然后像这样使用枢轴:
SELECT Col1 AS 'Col1',
[1], [2], [3], [4], [5]
FROM
(SELECT Col1, Col2
FROM dbo.Table1) AS SourceTable
PIVOT
(
MAX(Col2)
FOR Col2 IN ([1], [2], [3], [4], [5])
) AS PivotTable;
如果接受动态SQL,则可以构建SQL语句并使用sp_executesql
执行它:
DECLARE @Values VARCHAR(1000)
DECLARE @SQL NVARCHAR(MAX)
SET @Values = NULL
SELECT
@Values = COALESCE(@Values + ', ', '') + + '[' + CAST(Col2 AS VARCHAR) + ']'
FROM (SELECT DISTINCT TOP 100 PERCENT Col2 FROM dbo.Table1 ORDER BY 1) T
SET @SQL = '
SELECT Col1 AS ''Col1'',
' + @Values + '
FROM
(SELECT Col1, Col2
FROM dbo.Table1) AS SourceTable
PIVOT
(
MAX(Col2)
FOR Col2 IN (' + @Values + ')
) AS PivotTable;
'
EXECUTE sp_executesql @SQL
为什么不使用php或其他语言来做这些事情呢?术语问题:SQL Server查询不会“显示”任何内容。它返回一个resultset,消费软件可能稍后会显示该结果集。正如John所说,您必须查询该表,获取结果集,然后将其映射到能够反映该结果的某个对象。在本例中,示例对象将包含一个COL1类型的变量和一个Col2类型的列表,可能是一个具有COL1类型的键和值的映射,该值是在遇到该键时更新的列表