2013-06-24 94 views
1

我在数据库中有一个表顾客,如下所示。从第二行中选择列添加到第一行sql组中的第一行的末尾编号

ID UID Address1 Name code 
10 5 A   Jac 683501 
11 5 B   Joe 727272 
13 6 C   mat 373737 

前两条记录(10,11)有一个通用的uID -5。这两个记录可以被视为一个单位。 第四记录具有单独的UID,所以它是一个单独的单元

我需要产生输出在csv文件,使得

ID UID Name code  Address1 Name2 Code2 
10 5 jac 683501 A   Joe 727272 
13 6 mat 373737 C 

名称2和代码2的值从第二行中,由于前两条记录的UID相同,我们可以将其视为一个单位。

任何人都可以提示查询生成这些记录。

+0

您可以用[透视]这样做(http://msdn.microsoft.com/en-us/library/ms177410(v = SQL.105)的.aspx) 。 –

回答

2

这个过程从行数据转换为列被称为一个支点。有几种方法可以做到这一点。

您可以使用row_number()与CASE表达式的聚合函数一起:

select min(id), 
    uid, 
    max(case when seq = 1 then name end) Name, 
    max(case when seq = 1 then code end) Code, 
    max(case when seq = 1 then Address1 end) Address1, 
    max(case when seq = 2 then name end) Name2, 
    max(case when seq = 2 then code end) code2, 
    max(case when seq = 2 then Address1 end) Address1_2 
from 
(
    select id, uid, address1, name, code, 
    row_number() over(partition by uid order by id) seq 
    from yourtable 
) d 
group by uid; 

SQL Fiddle with Demo

你可以同时使用UNPIVOT与PIVOT功能:

select id, uid, 
    name1, code1, address1, name2, code2, address2 
from 
(
    select id, uid, col+cast(seq as varchar(10)) col, value 
    from 
    (
    select 
     (select min(id) 
     from yourtable t2 
     where t.uid = t2.uid) id, 
     uid, 
     cast(address1 as varchar(20)) address, 
     cast(name as varchar(20)) name, 
     cast(code as varchar(20)) code, 
     row_number() over(partition by uid order by id) seq 
    from yourtable t 
) d 
    unpivot 
    (
    value 
    for col in (address, name, code) 
) unpiv 
) src 
pivot 
(
    max(value) 
    for col in (name1, code1, address1, name2, code2, address2) 
) piv; 

SQL Fiddle with Demo

最后,如果你有一个未知的数值为每uid,那么你可以使用动态SQL得到的结果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(col+(cast(seq as varchar(10)))) 
        from 
        (
         select row_number() over(partition by uid order by id) seq 
         from yourtable 
        ) d 
        cross apply 
        (
         select 'name', 1 union all 
         select 'code', 2 union all 
         select 'address', 3 
        ) c (col, so) 
        group by seq, col, so 
        order by seq, so 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, uid,' + @cols + ' 
      from 
      (
       select id, uid, col+cast(seq as varchar(10)) col, value 
       from 
       (
        select 
        (select min(id) 
        from yourtable t2 
        where t.uid = t2.uid) id, 
        uid, 
        cast(address1 as varchar(20)) address, 
        cast(name as varchar(20)) name, 
        cast(code as varchar(20)) code, 
        row_number() over(partition by uid order by id) seq 
        from yourtable t 
       ) d 
       unpivot 
       (
        value 
        for col in (address, name, code) 
       ) unpiv 
      ) x 
      pivot 
      (
       max(value) 
       for col in (' + @cols + ') 
      ) p ' 

execute(@query); 

SQL Fiddle with Demo。所有版本会给结果:

| ID | UID | NAME1 | CODE1 | ADDRESS1 | NAME2 | CODE2 | ADDRESS2 | 
--------------------------------------------------------------------- 
| 10 | 5 | Jac | 683501 |  A | Joe | 727272 |  B | 
| 13 | 6 | mat | 373737 |  C | (null) | (null) | (null) | 
1

尝试内部连接。

select u2.firstname,u2.col2, 
from users u 
inner join users u2 on u.userid=u2.userid 
where u.firstname=u2.lastname 
+0

替换你的专栏,让我知道你是否需要任何帮助。 – bazz

+0

我不认为内连接会起作用,我们也不能加入名字也 – user1557886

+0

自连接不起作用 – user1557886

相关问题