首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将行值转换为列值-- SQL PIVOT

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

Stack Overflow用户
提问于 2012-02-03 02:36:55
回答 1查看 8.1K关注 0票数 4

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

代码语言:javascript
运行
复制
    ID  cow_id  barn_id
    --  ------  -------
    19    5       3
    20    5       2
    21    5       9
    22    5       1

我尝试在SQL中使用PIVOT获得以下结果

代码语言:javascript
运行
复制
     cow_id  barn1  barn2  barn3  barn4
     ------  -----  -----  -----  -----
       5       3      2      9      1

这就是我到目前为止所拥有的代码。

代码语言:javascript
运行
复制
    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吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-03 03:30:39

由于您的表中没有barn1..4,因此您必须以某种方式将ID替换为其对应的barn

使用PIVOT的一种解决方案可能如下所示

代码语言:javascript
运行
复制
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                 

另一种使用CASEGROUP BY的解决方案可能是

代码语言:javascript
运行
复制
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

但从本质上讲,这一切都归结为将ID硬编码为barn

编辑

如果您总是返回固定数量的记录,并且使用SQL Server,则可以通过以下方式使其更加健壮

  • adding a ROW_NUMBER to each result
  • pivot on this on number

(在此前期已知数字上为每个结果添加一个透视图)

SQL语句

代码语言:javascript
运行
复制
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

测试脚本

代码语言:javascript
运行
复制
;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
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9117955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档