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

时间:2015-02-04 09:02:10

标签: mysql sql sql-server pivot multiple-columns

我有2个表FormFieldsValues。我需要从FormFields表中选择行并设置为列名。它应该用Values表中的值填充这些列。 Values GroupId每个组都应该在新行中(其中GroupId = 1应填充第一行,其中GroupId = 2应填充第二行等等。)

FormFields表:

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

值表:

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

应该选择它(通过GroupId,其中GroupId = 1值应该转到第一行,其中GroupId = 2值应该转到第二行等等。在这个例子中,我只显示了14个值,但总共有28个值(在4组中)可供选择:

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

1 个答案:

答案 0 :(得分:0)

您需要将其设为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