Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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 Server中将行拆分为7列_Sql_Sql Server - Fatal编程技术网

在SQL Server中将行拆分为7列

在SQL Server中将行拆分为7列,sql,sql-server,Sql,Sql Server,我正试图找出与主值相关的从属值。我想在最后有七个SUB_VALX列。我知道我需要根据OB和VAL进行分组,同时根据我读过的其他文章旋转出SUB_VAL。但是,我看到的每个答案都会基于SUB_VAL值创建多个列。这是我的起始表: 开始数据 ---------------------- | OB | VAL | SUB_VAL | ---------------------- | 1 | 1 | NULL | | 2 | 2 | NULL | | 3 | 3 | 4

我正试图找出与主值相关的从属值。我想在最后有七个SUB_VALX列。我知道我需要根据OB和VAL进行分组,同时根据我读过的其他文章旋转出SUB_VAL。但是,我看到的每个答案都会基于SUB_VAL值创建多个列。这是我的起始表:

开始数据

----------------------
| OB | VAL | SUB_VAL |
----------------------
| 1  | 1   | NULL    |
| 2  | 2   | NULL    |
| 3  | 3   | 4       |
| 4  | 4   | NULL    |
| 5  | 6   | NULL    |
| 6  | 8   | 9       |
| 6  | 8   | 10      |
| 6  | 8   | 11      |
| 6  | 8   | 12      |
| 6  | 8   | 13      |
| 7  | 9   | 13      |
| 7  | 9   | 12      |
| 7  | 9   | 11      |
| 7  | 9   | 10      |
----------------------
----------------------------------------------------------------------------------------
| OB | VAL | SUB_VAL1 | SUB_VAL2 | SUB_VAL3 | SUB_VAL4 | SUB_VAL5 | SUB_VAL6 | SUB_VAL7 |
----------------------------------------------------------------------------------------
| 1  | 1   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 2  | 2   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 3  | 3   | 4        | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 4  | 4   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 5  | 6   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 6  | 8   | 9        | 10       | 11       | 12       | 13       | NULL     | NULL     |
| 7  | 9   | 13       | 12       | 11       | 10       | NULL     | NULL     | NULL     |
-----------------------------------------------------------------------------------------
我想将该表中的行透视出来,形成一个如下所示的表:

开始数据

----------------------
| OB | VAL | SUB_VAL |
----------------------
| 1  | 1   | NULL    |
| 2  | 2   | NULL    |
| 3  | 3   | 4       |
| 4  | 4   | NULL    |
| 5  | 6   | NULL    |
| 6  | 8   | 9       |
| 6  | 8   | 10      |
| 6  | 8   | 11      |
| 6  | 8   | 12      |
| 6  | 8   | 13      |
| 7  | 9   | 13      |
| 7  | 9   | 12      |
| 7  | 9   | 11      |
| 7  | 9   | 10      |
----------------------
----------------------------------------------------------------------------------------
| OB | VAL | SUB_VAL1 | SUB_VAL2 | SUB_VAL3 | SUB_VAL4 | SUB_VAL5 | SUB_VAL6 | SUB_VAL7 |
----------------------------------------------------------------------------------------
| 1  | 1   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 2  | 2   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 3  | 3   | 4        | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 4  | 4   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 5  | 6   | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     | NULL     |
| 6  | 8   | 9        | 10       | 11       | 12       | 13       | NULL     | NULL     |
| 7  | 9   | 13       | 12       | 11       | 10       | NULL     | NULL     | NULL     |
-----------------------------------------------------------------------------------------
下面是我采用的代码,它在运行时创建了超过128列(不是我试图实现的):


我花了一点时间才理解您试图实现的目标,但基本上您希望有一个与每个OB和VAL对关联的值列表。如果我是对的,您需要做的是创建一个包含每个值的位置索引的结果源。一个窗口功能是伟大的

下面将产生您想要的结果。我假设您只是在pivot中使用MAX作为访问pivot功能的方式—聚合不是必需的。子查询中的列键是生成列标题所需的。通过使用row_number,我为与OV、VAL对关联的每个值创建一个列索引

您可以在代码中将该子查询调整为select中的数据源以获取列名,也可以调整为动态sql中src的子查询。我以这种方式将其呈现给您,以便您可以轻松地验证其正确性

WITH testdata AS (
    SELECT * 
    FROM (VALUES 
        (1, 1, null), (2, 2, null), (3, 3, 4), (4, 4, null), (5, 6, null), (6, 8, 9), (6, 8, 10),   
        (6, 8, 11), (6, 8, 12), (6, 8, 13), (7, 9, 13), (7, 9, 12), (7, 9, 11), (7, 9, 10)
    ) x ( [OB],[VAL],[SUB_VAL] )
)
SELECT *
FROM (
    SELECT OB, VAL, SUB_VAL
        , 'SUB_VAL' + CAST(ROW_NUMBER() OVER(PARTITION BY OB, VAL ORDER BY SUB_VAL) AS VARCHAR(10)) [ColKey]
    FROM testdata
) src
PIVOT
(
    MAX(SUB_VAL)
    FOR [ColKey] IN (SUB_VAL1,SUB_VAL2,SUB_VAL3,SUB_VAL4,SUB_VAL5,SUB_VAL6,SUB_VAL7)
) pvt
ORDER BY OB, VAL
以下是对原始查询的修改,以生成动态sql:

SELECT @Cols = CONCAT(@Cols + ', ', QUOTENAME(ColKey))
FROM (
    SELECT OB, VAL, SUB_VAL SUB_VAL
         , 'SUB_VAL' + CAST(ROW_NUMBER() OVER(PARTITION BY OB, VAL ORDER BY SUB_VAL) AS VARCHAR(10)) [ColKey]
    FROM MyTable
) src
GROUP BY ColKey;

SET @DynSql = N'SELECT * 
FROM  
(
    SELECT OB, VAL, SUB_VAL SUB_VAL
         , ''SUB_VAL'' + CAST(ROW_NUMBER() OVER(PARTITION BY OB, VAL ORDER BY SUB_VAL) AS VARCHAR(10)) [ColKey]
    FROM MyTable
) src
PIVOT 
(
    MAX(SUB_VAL) 
    FOR ColKey IN (' + @Cols + N')
) pvt
ORDER BY OB';

EXECUTE sp_executesql @DynSql

你有固定的最多7列吗?你用什么来决定顺序?无法从示例数据中生成所需的输出,因为无法对行进行排序。@SeanLange yes有固定的最大7列,因为这是VAL可能的最大从属VAL数。此外,顺序也不重要。SUB_VAL可以以任何顺序存储在SUB_VAL 1、SUB_VAL 2等中,只要它们都在。谢谢,如果问题措辞笨拙,我向您道歉。您关于使用MAX访问pivot函数的假设是正确的。让我在我的数据中尝试一下。