我有两张桌子。我需要从FormFields
表中选择行并设置为列名。之后,应该用Values
表中的值填充这些列。FormFields
haveValues
每组应在新的行中(其中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/