Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将行显示为列_Sql_Sql Server_Pivot_Coalesce - Fatal编程技术网

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中的值是什么,它们将是动态的。数据库不太擅长执行您要求的操作。虽然我相信这是可能的,而且有人会在这里发布解决方案,但也许你可以通过

这是我的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中的值是什么,它们将是动态的。

数据库不太擅长执行您要求的操作。虽然我相信这是可能的,而且有人会在这里发布解决方案,但也许你可以通过一个小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类型的键和值的映射,该值是在遇到该键时更新的列表