0

1 つの列に一意の値を持つ行を持つテーブルがあります。1 つのエントリに複数のエントリがあるように、これらを行に配置するにはどうすればよいですか?

たとえば、ここにテーブルがあります...

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 
4

2 に答える 2

1

CAREY LEWIS結果に 2 回と 1 回表示されている理由はわかりませんが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 を参照してください

結果は次のとおりです。

| 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 |
于 2013-01-22T19:19:51.047 に答える
0

とを調べることをお勧めしCROSS APPLYますFOR 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

visit_view テーブルに ID がなかった理由、またはクロス適用の基準でそれを使用した理由がわかりませんでしたが、これにより正しい方向に進むはずです。

これがSQL Fiddleです。

幸運を。

于 2013-01-22T19:19:33.347 に答える