我有2个表FormFields
和Values
。我需要从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
答案 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