将行值转换为列值--SQL PIVOT

将行值转换为列值--SQL PIVOT,sql,pivot,Sql,Pivot,SQL从表中返回以下结果:CowTracking ID cow_id barn_id -- ------ ------- 19 5 3 20 5 2 21 5 9 22 5 1 我试图通过SQL中的PIVOT获得以下结果 cow_id barn1 barn2 barn3 barn4 ------ ----- ----- -----

SQL从表中返回以下结果:CowTracking

    ID  cow_id  barn_id
    --  ------  -------
    19    5       3
    20    5       2
    21    5       9
    22    5       1
我试图通过SQL中的PIVOT获得以下结果

     cow_id  barn1  barn2  barn3  barn4
     ------  -----  -----  -----  -----
       5       3      2      9      1
这是我目前掌握的代码

    SELECT *
    FROM 
    (
        SELECT TOP 4 *
        FROM CowTracking
            WHERE cow_id = 5
    ) AS DataTable
    PIVOT
    (
        MIN(barn_id) **IDK what function to use and which column to use it on**
        FOR ID  ??<---**NOT SURE**
        IN 
        (
        [barn1], [barn2], [barn3], [barn4]
        )
    ) AS PivotTable


    ERRORS: Error converting data type nvarchar to int
            The incorrect value "barn1" is supplied in the PIVOT operator
注意:barn_id是一个varchar。无法更改数据类型

我不是在尝试加法/乘法/加法或其他方法。我只是尝试将行移动到列

我该怎么做呢? 这是正确的思维过程吗

我甚至需要使用PIVOT吗?

由于您的表中没有barn1..4,您必须以某种方式将ID替换为相应的Barn

使用PIVOT的一个解决方案可能是这样的

SELECT  cow_id
        , [19] as [barn1]
        , [20] as [barn2]
        , [21] as [barn3]
        , [22] as [barn4]
FROM    (       
            SELECT  *
            FROM    DataTable
            PIVOT   (   MIN(barn_id)
                        FOR ID IN ([19], [20], [21], [22])
                    ) AS PivotTable
        ) q                 
使用CASE和groupby的另一个解决方案可以是

但在本质上,这一切归结为对谷仓的ID进行硬编码

编辑

如果您总是返回固定数量的记录,并且使用SQL Server,那么通过

向每个结果中添加行号 以这个预先已知的数字为轴心 SQL语句

测试脚本


你的第一个建议恰到好处。一开始我很担心,因为身份证总是会变。但后来我声明了一个新列,并将其设置为始终为1-4。然后我就可以完成了。谢谢,伙计,非常感谢。我花了一点时间才明白过来concept@sQuijeW-不客气。如果这回答了您的问题,您可以这样标记它
SELECT  cow_id
        , [barn1] = SUM(CASE WHEN ID = 19 THEN barn_id END)
        , [barn2] = SUM(CASE WHEN ID = 20 THEN barn_id END)
        , [barn3] = SUM(CASE WHEN ID = 21 THEN barn_id END)
        , [barn4] = SUM(CASE WHEN ID = 22 THEN barn_id END)
FROM    DataTable
GROUP BY
        cow_id
SELECT  cow_id  
        , [barn1] = SUM(CASE WHEN rn = 1 THEN barn_id END)
        , [barn2] = SUM(CASE WHEN rn = 2 THEN barn_id END)
        , [barn3] = SUM(CASE WHEN rn = 3 THEN barn_id END)
        , [barn4] = SUM(CASE WHEN rn = 4 THEN barn_id END)
FROM    (
            SELECT  cow_id
                    , rn = ROW_NUMBER() OVER (ORDER BY ID)
                    , barn_id
            FROM    DataTable       
        ) q
GROUP BY
        cow_id
;WITH DataTable (ID, cow_id, barn_id) AS (
    SELECT * FROM (VALUES 
        (19, 5, 3)
        , (20, 5, 2)
        , (21, 5, 9)
        , (22, 5, 1)
    ) AS q (a, b, c)        
)
SELECT  cow_id  
        , [barn1] = SUM(CASE WHEN rn = 1 THEN barn_id END)
        , [barn2] = SUM(CASE WHEN rn = 2 THEN barn_id END)
        , [barn3] = SUM(CASE WHEN rn = 3 THEN barn_id END)
        , [barn4] = SUM(CASE WHEN rn = 4 THEN barn_id END)
FROM    (
            SELECT  cow_id
                    , rn = ROW_NUMBER() OVER (ORDER BY ID)
                    , barn_id
            FROM    DataTable       
        ) q
GROUP BY
        cow_id