Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 - Fatal编程技术网

Sql 如何将一行中的多组不同列值透视到各自的单个列中?

Sql 如何将一行中的多组不同列值透视到各自的单个列中?,sql,sql-server,Sql,Sql Server,在SQL Server中,我想知道如何从以下行开始: create table t1 ( n1 int, n2 int, n3 int, a1 char, a2 char, a3 char, b1 char, b2 char, b3 char ) insert into t1 values (1, 2, 3, 'a', 'b', 'c', 'x', 'y', 'z') 到将返回以下内容的查询: n1 n2 n3 As Bs 1, 2, 3, a, x 1, 2, 3, b, y 1

在SQL Server中,我想知道如何从以下行开始:

create table t1
(
n1 int,
n2 int,
n3 int,
a1 char, 
a2 char,
a3 char,
b1 char, 
b2 char, 
b3 char
)

insert into t1 values (1, 2, 3, 'a', 'b', 'c', 'x', 'y', 'z')
到将返回以下内容的查询:

n1 n2 n3 As Bs

1, 2, 3, a, x 
1, 2, 3, b, y
1, 2, 3, c, z

我要透视的列组是静态的,列数相等

联合查询如何:

SELECT
    n1
    , n2
    , n3
    , a1 AS [As]
    , b1 AS [Bs]
FROM 
    t1
UNION ALL
SELECT
    n1
    , n2
    , n3
    , a2
    , b2
FROM 
    t1
UNION ALL
SELECT
    n1
    , n2
    , n3
    , a3
    , b3
FROM t1
order by a1
试试这个

SELECT n1,n2,n3,a,b
FROM 
   (SELECT * FROM t1) p
    UNPIVOT (a FOR ACOL IN (a1,a2,a3))AS u1
    UNPIVOT (b FOR BCOL IN (b1,b2,b3))AS u2
WHERE RIGHT(ACOL,1) =  RIGHT(BCOL,1);

顺便说一句。。这使我不必修改讨厌的报表项目。是什么决定了“a”与“x”匹配,而不是与“y”或“z”匹配?这是因为a1必须与x1配对吗?如果再合并两列,查询似乎无法正常工作。。我必须以某种方式调整where条款?选择n1、n2、n3、a作为有效值,b作为b值,c作为c值,d作为选择*中的d值,从t1 p为a1、a2、A3A中的ACOL取消PIVOT a为b1中的BCOL取消PIVOT b为b1、b2中的BCOL取消PIVOT b为c1中的CCOL取消PIVOT c为d1、d2、D3中的DCOL取消PIVOT d,其中RIGHTACOL,1=RIGHTBCOL,1@用户2027080,您需要将其添加到where子句和RIGHTACOL中,1=RIGHTACOL,1和RIGHTACOL,1=RIGHTDCOL,1我计算出来:选择n1、n2、n3、a作为有效值,b作为BValues,c作为CValues,d作为DValues从SELECT*中选择的值,从t1 p为a1中的ACOL取消PIVOT a,从a2中选择,从A3A为b1中的BCOL取消PIVOT b,从b2中选择,从B3为c1为CCOL中选择u2为CCOL取消PIVOT c,c3AS u3为d1、d2、d3AS u4中的DCOL取消IVOT d,其中RIGHTACOL,1=RIGHTBCOL,1和RIGHTBCOL,1=RIGHTCCOL,1和RIGHTCCOL,1=RIGHTDCOL,1;我在将其传输到我的实现时遇到问题,并且得到了重复的行/排列。我不确定我是否完全理解where子句是如何工作的,以及它在做什么。我明白了。右1函数引用的是列标题的最后一位/字符,而不是字段值。