gpt4 book ai didi

sql - 透视重复的列名称并获取列的所有值

转载 作者:行者123 更新时间:2023-12-03 00:10:22 25 4
gpt4 key购买 nike

说明

假设我有 2 张 table 。 FormFields 其中将列名称存储为值,应进行透视,第二个表 FilledValues 包含用户通过提供的 FormFieldId 填充的值。

问题

正如您在 FormFields 表中看到的(下面的示例部分),我有重复的名称,但 ID 不同。我需要在连接表后,FilledValues 表中的所有值都将分配给列名,而不是 Id。

我需要更好的内容,您将在下面的输出部分中看到。

样本数据

表单字段

ID   Name  GroupId
1 col1 1
2 col2 1
3 col3 1
4 col1 2
5 col2 2
6 col3 2

填充值

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

查询

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com