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/

10-16 07:24