枢。使用行作为列名并填充记录

PIVOT. Use rows as column name and fill records

我有 2 tables FormFieldsValues。我需要 FormFields table 中的 select 行并设置为列名。之后它应该用 Values table 中的值填充这些列。 ValuesGroupId 每组应在新行中(其中 GroupId = 1 应填充第一行,其中 GroupId = 2 应填充第二行等)

表单域 table:

Id   GroupId     Name
1       1       Examp11       
2       1       Examp12  
3       1       Examp13   
4       1       Examp14   
5       1       Examp15   
6       1       Examp16 
7       2       Examp17  -- End of the group 1    
8       2       Examp11  -- From here should start second row (after pivot)
9       2       Examp12   
10      2       Examp13   
11      2       Examp14   
12      2       Examp15 
13      2       Examp16 
14      2       Examp17 -- End of the group 2

值table:

Id   GroupId   FormFieldId   Value
18       1           1        val1
19       1           2        val2
20       1           3        val3
21       1           4        val4   
22       1           5        val5   
23       1           6        val6
24       1           7        val7 
25       2           1        val8 -- From here start duplicating FormFieldId, changed GroupId to 2
26       2           2        val9
27       2           3        val10   
28       2           4        val11   
29       2           5        val12
30       2           6        val13
31       2           7        val14

它应该被 select 编辑为(按 GroupId,其中 GroupId = 1 值应该转到第一行,其中 GroupId = 2 值应该转到第二行等等)。在此示例中,我只向您展示了 14 个值,但我总共有 28 个值(在 4 组中)到 select:

Examp11  Examp12  Examp13  Examp14  Examp15  Examp16  Examp17       
  val1     val2     val3     val4     val5     val6     val7  -- GroupId = 1
  val8     val9     val10    val11    val12    val13    val4  -- GroupId = 2

我知道我需要使用PIVOT,但无法成功。

我试过了,但是它抛出了

的错误
DECLARE @cols AS NVARCHAR(MAX)
SET @cols = 'SELECT [Name] FROM FormFields WHERE ID BETWEEN 1 AND 6'
SELECT * FROM 
(
    SELECT Name
    FROM FormFields
) x
PIVOT
(
    MIN (Name)
    FOR Name IN (' + @cols + ')
) p

您需要将其设为 Dynamic query 才能使用 @cols(列)。

我还对列列表进行了更改@cols

DECLARE @cols AS NVARCHAR(MAX)='',
        @sql  NVARCHAR(max)

SELECT @cols += Isnull([Name], '') + ','
FROM   (SELECT DISTINCT name
        FROM   FormFields
        WHERE  ID BETWEEN 1 AND 6)a 


SET @cols = LEFT(@cols, Len(@cols) - 1)
SET @sql=' SELECT * FROM 
(
    SELECT v.GroupId, Name,Value
    FROM FormFields F join Values V on F.id= v.FormFieldId
) x PIVOT
(
    MIN (Value)
    FOR Name IN (' + @cols + ')
) p'

EXEC Sp_executesql @sql