Список столбцов в SQL - PullRequest
0 голосов
/ 17 июня 2009

Введите:

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 ]

2 голосов
/ 18 июня 2009

Я не думаю, что ваша проблема четко определена, но вот решение:

--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)
0 голосов
/ 19 июня 2009

Это работает, но только если все 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
    )
0 голосов
/ 18 июня 2009

выберите 'N1', Имя1 от вашего где name1 <> 'N1' союз

выберите 'N2', Имя2 от вашего где name2 <> 'N2'

союз

выберите «N3», «Имя3» от вашего где name3 <> 'N3'

союз

выберите 'N4', Name4 от вашего где name4 <> 'N4'

- таблица не нормализована, поэтому используется этот тип sql.

0 голосов
/ 17 июня 2009

Это называется EAV design. Если вы ожидаете больших объемов данных, ваша производительность будет очень низкой. Если это так, вы можете перейти к таблице с N1 N2 N3 N4 в виде столбцов, оставляя ваш текущий дизайн.

0 голосов
/ 17 июня 2009

Это не красиво, но я использовал для этого утверждение case, но заголовки должны быть предопределены.

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'
0 голосов
/ 17 июня 2009
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

Я назвал столбцы N_column и N_Values ​​из вашей исходной таблицы [your_table] Не уверен в реальных именах.

Если вы используете min, max, вы можете агрегировать любое значение, так как есть только одно.

0 голосов
/ 17 июня 2009

Вы не можете сделать это, потому что согласно справочным документам Microsoft:

:: = (aggregate_function (value_column) FOR pivot_column В ( ) )

Таким образом, если вы не выполняете какую-либо агрегатную функцию, вы не собираетесь просто получить поворот столбца с помощью функции сводки.

Тем не менее, вы можете сделать сводку данных выше с помощью обычного выбора и оператора case.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...