如何根据列值在单个列中显示多个表的列?

问题描述:

我有这样一个表:如何根据列值在单个列中显示多个表的列?

main table 现在我想编写一个查询,可以显示这些数据如下:

desire result

我怎样才能做到这一点?有人可以帮我吗?

+7

这是在表示层... SQL-服务器较好地解决了不允许与*列组*,其中有一些像一个结果a * meta-header * ...您不能一次又一次地使用同一个列名,(至少如果您想在任何嵌入式上下文中使用此结果集)。 – Shnugo

+3

**请!**:请勿插入图片!如果有人想帮助你,你必须手动键入你的数据。请阅读[如何创建一个MCVE](http://stackoverflow.com/help/mcve) – Shnugo

+0

@Shnugo谢谢你。如果你知道我的问题,请删除标题并给我一个答案。我只想要数据,而不是标题 – Mohsen

SELECT Grade AS ISG, 
      P1AR, P1SM1, P1SM2, 
      P2AR, P2SM1, P2SM2, 
      P3AR, P3SM1, P3SM2 
    FROM 
    (
      SELECT Grade, 
        col = 'P' + CAST(Process AS NVARCHAR) +col, 
        value 
      FROM yourTable 

      CROSS APPLY 
      (
       VALUES 
       ('AR', AR), 
       ('SM1', SM1), 
       ('SM2', SM2) 
      ) c(col, value) 
    ) d 
    PIVOT 
    (
      MAX(value) 
      FOR col IN (P1AR, P1SM1, P1SM2, 
         P2AR, P2SM1, P2SM2, 
         P3AR, P3SM1, P3SM2) 
    ) piv 

另一种方式来写这个查询:

SELECT 
a.Grade AS ISG, 
a.AR AS P1AR, 
a.SM1 AS P1SM1, 
a.SM2 AS P1SM2, 

b.AR AS P2AR, 
b.SM1 AS P2SM1, 
b.SM2 AS P2SM2, 

c.AR AS P3AR, 
c.SM1 AS P3SM1, 
c.SM2 AS P3SM2  
FROM yourTable a 
INNER JOIN yourTable b 
ON  a.Grade = b.Grade 
INNER JOIN yourTable c 
ON  a.Grade = c.Grade 

where a.Process = 1 and 
     b.Process = 2 and 
     c.Process = 3