枢。使用行作为列名并填充记录
PIVOT. Use rows as column name and fill records
我有 2 tables FormFields
和 Values
。我需要 FormFields
table 中的 select 行并设置为列名。之后它应该用 Values
table 中的值填充这些列。 Values
有 GroupId
每组应在新行中(其中 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
我有 2 tables FormFields
和 Values
。我需要 FormFields
table 中的 select 行并设置为列名。之后它应该用 Values
table 中的值填充这些列。 Values
有 GroupId
每组应在新行中(其中 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