EXPLAINATION
想象一下,我有2张 table 。 FormFields
将列名称存储为值,应将其进行透视处理,并在第二个表FilledValues
中提供用户填充的值,并提供FormFieldId
。
问题
正如您在FormFields
表中看到的(在SAMPLE部分下面),我有重复的名称,但是ID不同。我需要确保在加入表之后,FilledValues
表中的所有值都将被关联到列名,而不是ID。
我需要更好的是,您将在下面的“输出”部分中看到。
样本数据FormFields
ID Name GroupId
1 col1 1
2 col2 1
3 col3 1
4 col1 2
5 col2 2
6 col3 2
FilledValues
ID Name FormFieldId GroupID
1 a 2 1
2 b 3 1
3 c 1 1
4 d 4 2
5 e 6 2
6 f 5 2
立即输出
col1 col2 col3
c a b -- As you see It returning only values for FormFieldId 1 2 3
-- d, e, f are lost that because It have duplicate col names, but different id's
所需的输出
col1 col2 col3
c a b
e f d
QUERY
SELECT * FROM
(
SELECT FF.Name AS NamePiv,
FV.Name AS Val1
FROM FormFields FF
JOIN FilledValues FV ON FF.Id = FV.FormFieldId
) x
PIVOT
(
MIN(Val1)
FOR NamePiv IN ([col1],[col2],[col3])
) piv
SQL FIDDLE
如何生成具有多行的输出?
最佳答案
由于您使用的是PIVOT,因此正在汇总数据,因此对于分组的每一列,您只返回一个值。您的子查询中没有任何唯一的列,并且在PIVOT的分组方面没有用于返回多行的列。为此,您需要一些值(value)。如果对于每个“组”都有一列具有唯一值的列,则可以使用该列,也可以使用诸如row_number()
的窗口函数。row_number()
将为每个FF.Name
创建一个序列号,这意味着如果您有2个col1
,则将为一行生成1
,为另一行生成2
。一旦这包含在您的子查询中,您现在将拥有一个唯一值,该值将在汇总数据时使用,并且您将返回多行:
SELECT [col1],[col2],[col3]
FROM
(
SELECT
FF.Name AS NamePiv,
FV.Name AS Val1,
rn = row_number() over(partition by ff.Name order by fv.Id)
FROM FormFields FF
JOIN FilledValues FV ON FF.Id = FV.FormFieldId
) x
PIVOT
(
MIN(Val1)
FOR NamePiv IN ([col1],[col2],[col3])
) piv;
参见SQL Fiddle with Demo。输出为:
| col1 | col2 | col3 |
|------|------|------|
| c | a | b |
| e | f | d |
关于sql - 透视重复的列名并获取列的所有值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31857386/