2013-01-22 54 views
0

我有一个表中有一列中具有唯一值的行。我怎样才能把这些放在一行中,使一个条目有多个条目?如何将重复列转换为行?

例如这里是一个表...

create table visit_view 
(
    last_name varchar(25), 
    first_name varchar(25), 
    middle_name varchar(25), 
    dob datetime, 
    di datetime, 
    m varchar(20), 
    d varchar(12), 
    d_sequence_num smallint 
) 

insert into visit_view values ('LEE','BUDDY','','05/20/2010','10/01/2012','123456','786.2','2') 
insert into visit_view values ('LEE','BUDDY','','05/20/2010','10/01/2012','123456','784.99','3') 
insert into visit_view values ('TU','BIBO','LU','09/29/2012','10/01/2012','321456','774.6','1') 
insert into visit_view values ('SMITH','BOBBIE','JOE','09/29/2012','10/01/2012','321654','V50.2','1') 
insert into visit_view values ('LEWIS','CAREY','','11/11/2011','10/01/2012','654123','057.9','2') 
insert into visit_view values ('LEWIS','CAREY','','11/11/2011','10/01/2012','654123','074.3','3') 
insert into visit_view values ('RAMIREZ','HECTOR','','04/21/2011','10/02/2012','654321','381.81','2') 
insert into visit_view values ('RAMIREZ','HECTOR','','04/21/2011','10/02/2012','654321','786.09','3') 
insert into visit_view values ('RAMIREZ','HECTOR','','04/21/2011','10/02/2012','654321','380.4','4') 
insert into visit_view values ('RAMIREZ','HECTOR','','04/21/2011','10/02/2012','654321','478.19','5') 

而且我的查询看起来像这样...

SELECT 
    first_name AS FirstName, 
    ISNULL(middle_name, '') AS MI, 
    last_name AS LastName, 
    CONVERT(varchar,dob, 101) DOB, 
    CONVERT(varchar,di,101) DCdate, 
    CAST(m AS INT) AS MR, 
    d AS Diag 
FROM 
    visit_view 
WHERE 
    d_sequence_num>1 
    AND DATEDIFF(year,dob,GETDATE()) <= 3 
ORDER BY di,d_sequence_num ASC 

我我的输出是

FIRSTNAME MI LASTNAME DOB DCDATE MR DIAG 
CAREY LEWIS 11/11/2011 10/01/2012 654123 057.9 
BUDDY LEE 05/20/2010 10/01/2012 123456 786.2 
BUDDY LEE 05/20/2010 10/01/2012 123456 784.99 
CAREY LEWIS 11/11/2011 10/01/2012 654123 074.3 
HECTOR RAMIREZ 04/21/2011 10/02/2012 654321 381.81 
HECTOR RAMIREZ 04/21/2011 10/02/2012 654321 786.09 
HECTOR RAMIREZ 04/21/2011 10/02/2012 654321 380.4 
HECTOR RAMIREZ 04/21/2011 10/02/2012 654321 478.19 

但我想它是这样的...

FIRSTNAME MI LASTNAME DOB DCDATE MR DIAG 
CAREY LEWIS 11/11/2011 10/01/2012 654123 057.9 
BUDDY LEE 05/20/2010 10/01/2012 123456 786.2 784.99 
CAREY LEWIS 11/11/2011 10/01/2012 654123 074.3 
HECTOR RAMIREZ 04/21/2011 10/02/2012 654321 381.81 786.09 380.4 478.19 
+0

尝试:http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-microsoft-sql-server-2005 –

+0

并在这里为SQL Server解决方案:http://support.microsoft.com/kb/2046037/sql-server-can-i-comma-delimit-multiple-rows-into-one-column – Art

回答

1

我不知道为什么你CAREY LEWIS显示两次在结果和HECTOR RAMIREZ一次,但你可以使用像这样巩固行:

SELECT 
    first_name AS FirstName, 
    ISNULL(middle_name, '') AS MI, 
    last_name AS LastName, 
    CONVERT(varchar,dob, 101) DOB, 
    CONVERT(varchar,di,101) DCdate, 
    CAST(m AS INT) AS MR, 
    stuff((select distinct ', '+ d 
      from visit_view v1 
      where v.first_name = v1.first_name 
      FOR XML PATH('')),1,1,'') Diag 
FROM visit_view v 
WHERE d_sequence_num>1 
    AND DATEDIFF(year,dob,GETDATE()) <= 3 
GROUP BY first_name, middle_name, last_name, dob, di, m 
ORDER BY di ASC 

SQL Fiddle with Demo

给出结果:

| FIRSTNAME | MI | LASTNAME |  DOB |  DCDATE |  MR |       DIAG | 
------------------------------------------------------------------------------------------------- 
|  BUDDY | |  LEE | 05/20/2010 | 10/01/2012 | 123456 |     784.99, 786.2 | 
|  CAREY | | LEWIS | 11/11/2011 | 10/01/2012 | 654123 |     057.9, 074.3 | 
| HECTOR | | RAMIREZ | 04/21/2011 | 10/02/2012 | 654321 | 380.4, 381.81, 478.19, 786.09 | 
+0

凯里两次是我的错误,这正是我所期待的! – dwtorres

+0

+1为SQL小提琴 - 我不知道存在 - 它已被添加到我的书签栏 –

+0

@dwtorres高兴地帮助,如果他们有帮助,一定要接受你的问题的答案之一。您可以通过点击答案左侧的复选标记来接受 – Taryn

0

我会建议寻找到CROSS APPLYFOR XML

SELECT DISTINCT 
    first_name AS FirstName, 
    ISNULL(middle_name, '') AS MI, 
    last_name AS LastName, 
    CONVERT(varchar,dob, 101) DOB, 
    CONVERT(varchar,di,101) DCdate, 
    CAST(m AS INT) AS MR, 
    STUFF(D2.d, 1, 1, '') AS Diag 
FROM 
    visit_view v 
CROSS APPLY (SELECT ',' + d 
       FROM visit_view v2 
       WHERE v.last_name = v2.last_name 
       ORDER BY d_sequence_num 
        FOR XML PATH('')) D2 (d) 
WHERE 
    d_sequence_num>1 
    AND DATEDIFF(year,dob,GETDATE()) <= 3 

不知道为什么你没有一个ID在你visit_view表或会用在我的交叉应用,其中的标准,但这应该让你朝着正确的方向前进。

这里是SQL Fiddle

祝你好运。