【问题标题】:PIVOT. Use rows as column name and fill records枢。使用行作为列名并填充记录
【发布时间】:2015-02-04 09:02:10
【问题描述】:

我有 2 张桌子 FormFieldsValues。我需要从FormFields 表中选择行并设置为列名。 After 它应该用来自Values 表的值填充这些列。 ValuesGroupId 每个组应该在新行中(GroupId = 1 应该填充第一行,GroupId = 2 应该填充第二行等等)

FormFields 表:

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

我知道我需要使用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

【问题讨论】:

    标签: mysql sql sql-server pivot multiple-columns


    【解决方案1】:

    您需要将其设为Dynamic query 才能使用@cols(列)。

    我还对列列表@cols generation 进行了更改

    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 
    

    【讨论】:

    • 感谢您的回答。它成功地将行作为列名返回,但是如何提出问题的第二部分,用Values 表中的值填充这些列?
    • @Infinity - 只是join values 表。立即更新检查
    • 感谢您的回答。现在,如果我将WHERE range 更改为BETWEEN 1 AND 28,则会出现以下错误:The column 'Examp11' was specified multiple times for 'p'. 也许是因为FormFieldId = 7FormFieldId =1 是重复值,但我也需要添加重复项作为列名或者这是不可能的?
    • @Infinity - 现在更新检查
    • 如果列名不能重复,我用如何制作它更新了我的问题
    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2020-10-11
    • 1970-01-01
    相关资源
    最近更新 更多