我有两张桌子。我需要从FormFields表中选择行并设置为列名。之后,应该用Values表中的值填充这些列。FormFieldshaveValues每组应在新的行中(其中Values应填充第一行,其中GroupId应填充第二行等)
表单域表:

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

我知道我需要使用GroupId = 1,但无法成功。
我已经试过了,但它犯了个错误
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

关于mysql - 枢。使用行作为列名并填写记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28317289/

10-13 06:48