2012-02-02 69 views
4

SQL返回从表中的结果如下:CowTracking使行值成列的值 - SQL PIVOT

ID cow_id barn_id 
    -- ------ ------- 
    19 5  3 
    20 5  2 
    21 5  9 
    22 5  1 

我试图得到一个PIVOT以下结果在SQL

 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吗?

回答

5

由于您的表格中没有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     

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

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 

,但在本质上,这一切都归结为硬编码的IDbarn


编辑

如果你总是返回记录固定数量,并使用SQL Server,则可能使这一点更强大的通过

  • 添加ROW_NUMBER每个结果
  • 透视此前期已知号码

SQL语句

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 
+1

你的第一个建议是当场上。起初我很担心,因为ID会一直改变。但后来我宣布了一个新的专栏,并设置了它,以便它始终是1 - 4。然后我能够完成它。感谢队友,非常感谢。带我一点点,让我的头绕着这个概念 – sQuijeW 2012-02-02 20:34:16

+0

@sQuijeW - 不客气。如果这回答你的问题,你可以将它标记为*([接受答案如何工作?](http://meta.stackexchange.com/questions/5234))* – 2012-02-02 20:49:31