SQL中的列列表

时间:2009-06-17 17:02:09

标签: sql sql-server tsql

输入:

Name         Id

N1            1
N1            3
N1            4
N1            7
N2            2
N2            1
N2            8
N2            5
N3            4
N3            8
N3            5
N3            3
N4            7
N4            7
N4            7
N4            8

输出:

Name1 Name2 Name3 Name4
-----------------------
  N1   N2   N3      N4
   1    2    4      7 
   3    1    8      7
   4    8    5      7
   7    5    3      8

请帮助

7 个答案:

答案 0 :(得分:2)

我认为您的问题没有明确定义,但这是一个解决方案:

--CREATE TABLE so1008354 (
--  Name1 VARCHAR(10)
--  ,Name2 VARCHAR(10)
--  ,Name3 VARCHAR(10)
--  ,Name4 VARCHAR(10)
--)
--
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ( 'N1', 'N2', 'N3', 'N4' ) 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ( '1', '2', '4', '7' ) 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ( '3', '1', '8', '7' ) 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ( '4', '8', '5', '7' ) 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ( '7', '5', '3', '8' ) 

SELECT  *
FROM    so1008354

--
;
WITH    unpvt
          AS ( SELECT   col1,
                        col2
               FROM     so1008354 UNPIVOT ( col2 FOR col1 IN ( [Name1], [Name2], [Name3], [Name4] ) ) AS unpvt
             ) ,
        XLate
          AS ( SELECT   col1 AS NameList_pre,
                        col2 AS NameList
               FROM     unpvt
               WHERE    col2 LIKE 'N%'
             ) ,
        Data
          AS ( SELECT   col1 AS NameList_pre,
                        col2 AS Tokens
               FROM     unpvt
               WHERE    col2 NOT LIKE 'N%'
             )
    SELECT  XLate.NameList,
            Data.Tokens
    FROM    Data
            INNER JOIN XLate ON XLate.NameList_pre = Data.NameList_pre
    ORDER BY XLate.NameList,
            Data.Tokens

结果如下:

Name1      Name2      Name3      Name4
---------- ---------- ---------- ----------
N1         N2         N3         N4
1          2          4          7
3          1          8          7
4          8          5          7
7          5          3          8

(5 row(s) affected)

NameList   Tokens
---------- ----------
N1         1
N1         3
N1         4
N1         7
N2         1
N2         2
N2         5
N2         8
N3         3
N3         4
N3         5
N3         8
N4         7
N4         7
N4         7
N4         8

(16 row(s) affected)

答案 1 :(得分:0)

你不能这样做,因为根据微软的帮助文档:

:: =         (aggregate_function(value_column)         对于pivot_column         IN()     )

因此,除非您正在进行某种聚合函数,否则您不会仅使用pivot函数获取列的轴。

但是,您可以使用普通的select和case语句对上面的数据进行透视。

答案 2 :(得分:0)

Select N1, N2, N3, N4
from
(select N_Column, N_Values from [your_table]) p
PIVOT MIN(Tokens)
FOR NameList IN ([N1],[N2],[N3],[N4])
) pvt

我从原始表[your_table]中调用了N_column和N_Values列 不确定实际名称。

如果你使用min,max,你可以聚合任何值,因为只有一个。

答案 3 :(得分:0)

它不漂亮,但我已经使用了一个案例陈述,但标题需要预先确定。

SELECT CASE heading
WHEN 'N1' THEN value END AS 'N1'
, CASE heading WHEN 'N2' THEN value END AS 'N2'
, CASE heading WHEN 'N3' THEN value END AS 'N3'
, CASE heading WHEN 'N4' THEN value END AS 'N4'

答案 4 :(得分:0)

这称为EAV设计。如果您期望大量数据,那么您的表现将非常差。如果是这种情况,您可能需要切换到具有N1 N2 N3 N4的表 作为专栏,放弃你当前的设计。

答案 5 :(得分:0)

选择'N1',Name1 来自your_able 其中name1<> 'N1' 工会

选择'N2',Name2 来自your_able 其中name2<> 'N2'

联盟

选择'N3',Name3 来自your_able 其中name3<> 'N3'

联盟

选择'N4',Name4 来自your_able 其中name4<> 'N4'

- 表未规范化,因此使用了这种sql。

答案 6 :(得分:0)

这只有在N1 ... N4具有相同数量的标记时才有效。

SELECT 'N1' AS 'Name1', 'N2' AS 'Name2', 'N3' AS 'Name3', 'N4' AS 'Name4'

UNION ALL

SELECT 
        CAST(t1.Tokens AS varchar), 
        CAST(t2.Tokens AS varchar), 
        CAST(t3.Tokens AS varchar), 
        CAST(t4.Tokens AS varchar)

     FROM (

        (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N1') t1
         JOIN (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N2') t2 ON t1.rownum = t2.rownum
         JOIN (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N3') t3 ON t1.rownum = t3.rownum
         JOIN (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N4') t4 ON t1.rownum = t4.rownum
    )