2017-04-09 57 views
-1

我有一个看起来是这个样子的3和3个重复行的表...MS SQL集团行

Column1  | Column2 
CustomerID | 22 
CustomerName | ”ABC” 
Responsible | ”Allan” 
CustomerID | 23 
CustomerName | ”DEF” 
Responsible | ”Jessica” 
CustomerID | 24 
CustomerName | ”GHI” 
Responsible | ”Paul” 

下面的脚本可以用来创建表并填充它样本数据...

CREATE TABLE Responsible 
    ([ RowType ] VARCHAR(12), 
     [ Value ] VARCHAR(9)) 
; 

INSERT INTO Responsible 
    ([RowType], 
     [ Value ]) 
VALUES 
    ('CustomerID', 
     '22'), 
    ('CustomerName', 
     'ABC'), 
    ('Responsible', 
     'Allan'), 
    ('CustomerID', 
     '23'), 
    ('CustomerName', 
     'DEF'), 
    ('Responsible', 
     'Jessica'), 
    ('CustomerID', 
     '24'), 
    ('CustomerName', 
     'GHI'), 
    ('Responsible', 
     'Paul'); 

而且我想获得它像一个表,看起来像这样:

CustomerID | CustomerName | Responsible 
22   | ABC   | Allan 
23   | DEF   | Jessica 
24   | GHI   | Paul  

什么是最好的前进方向?

+0

什么数据库引擎?你没有任何领域可以在你的桌子上分组吗? – Blag

+1

您正在使用哪些DBMS? Postgres的?甲骨文? –

+2

你不能这样做。 SQL表格表示*无序*行。如果没有指定顺序的列,则无法可靠地连接行。 –

回答

0

我得到了它这样的工作,在SQL Server中。我没有看到任何其他选项,但是使用光标一次下移一行。 下面的脚本只适用于您的独特情况。

创建新表

USE [YOURDATABASE NAME GOES HERE] 
GO 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Table_2](
    [CustomerID] [int] NULL, 
    [CustomerName] [varchar](50) NULL, 
    [Responsible] [varchar](50) NULL 
) ON [PRIMARY] 

GO 

将数据插入到表

DECLARE @CustomerId INT 
DECLARE @CustomerName VARCHAR(50) 
DECLARE @Responsible VARCHAR(50) 
DECLARE myCursor CURSOR 
FOR SELECT Column2 FROM Table_1; 
OPEN myCursor; 
FETCH NEXT FROM myCursor 
INTO @CustomerId; 

FETCH NEXT FROM myCursor 
INTO @CustomerName; 

FETCH NEXT FROM myCursor 
INTO @Responsible; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     INSERT INTO [dbo].[Table_2](CustomerID,CustomerName,Responsible) 
     VALUES (@CustomerId,@CustomerName,@Responsible) 

     FETCH NEXT FROM myCursor 
     INTO @CustomerId; 

     FETCH NEXT FROM myCursor 
     INTO @CustomerName; 

     FETCH NEXT FROM myCursor 
     INTO @Responsible; 
END 
CLOSE myCursor; 
DEALLOCATE myCursor; 
GO 
+0

它的工作原理!非常感谢:o) – FredrikUmea

+0

Fredrik,不客气。 – Jason

0

编辑,SQL Server版本:

查询10

select CustomerID, CustomerName, Responsible 
from (
select row_number() over(order by k) as id , v as CustomerID 
from t1 
where k ='CustomerID') tt1 
inner join (
select row_number() over(order by k) as id , v as CustomerName 
from t1 
where k ='CustomerName') tt2 
on tt1.id = tt2.id 
inner join (
select row_number() over(order by k) as id , v as Responsible 
from t1 
where k ='Responsible') tt3 
on tt1.id = tt3.id 

Results

| CustomerID | CustomerName | Responsible | 
|------------|--------------|-------------| 
|   22 |   ABC |  Allan | 
|   23 |   DEF |  Jessica | 
|   24 |   GHI |  Paul | 

这就是你要我怎么想?

SQL Fiddle

的MySQL 5.6架构设置

CREATE TABLE t1 
    (`k` varchar(12), `v` varchar(9)) 
; 

INSERT INTO t1 
    (`k`, `v`) 
VALUES 
    ('CustomerID', '22'), 
    ('CustomerName', 'ABC'), 
    ('Responsible', 'Allan'), 
    ('CustomerID', '23'), 
    ('CustomerName', 'DEF'), 
    ('Responsible', 'Jessica'), 
    ('CustomerID', '24'), 
    ('CustomerName', 'GHI'), 
    ('Responsible', 'Paul') 
; 

查询1

set @v1 = 0, @v2 = 0, @v3 = 0 

查询2

select CustomerID, CustomerName, Responsible 
from (
    select @v1:= @v1+1 as id , v as CustomerID 
    from t1 
    where k ='CustomerID' 
) tt1 
inner join (
    select @v2:= @v2+1 as id , v as CustomerName 
    from t1 
    where k ='CustomerName' 
) tt2 
    on tt1.id = tt2.id 
inner join (
    select @v3:= @v3+1 as id , v as Responsible 
    from t1 
    where k ='Responsible' 
) tt3 
    on tt1.id = tt3.id; 

Results

| CustomerID | CustomerName | Responsible | 
|------------|--------------|-------------| 
|   22 |   ABC |  Allan | 
|   23 |   DEF |  Jessica | 
|   24 |   GHI |  Paul | 
+0

非常感谢,非常感谢,但有可能让我自欺欺人。我正在使用Microsoft SQL而不是MySQL。语法如何不同? – FredrikUmea

+0

@FredrikUmea编辑,这里是MS-sql版本;) – Blag