2017-06-07 4 views
0

Das Problem ist, dass, wenn zu viele Datensätze eingegeben werdenMulti Reihen in 1 Reihen, SQL Server

  | id | name | age | Tel 
------------------------------------------ 
     1 | 1 | Frank | 40  | null 
     2 | 1 | null | 50  | 7834xx 
     3 | 1 | Alex | null | null 
     4 | 1 | null | 20  | null 
     5 | 2 | James | null | 4121xx 

Meine Suche:

select id, max(name) as name, max(age) as age, max(tel) as tel 
from Table group by id; 

Ergebnis = der Maximalwert zurückgeben Like:

  | id | name | age | Tel 
------------------------------------------ 
     1 | 1 | Frank | 50  | 7834xx 

Aber ich brauche Select Abfrage wie folgt: Beispiel: (vielleicht): wählen Sie ID, lastRow sNotNull (Name) als Name, lastRowsNotNull (Alter) als Alter, lastRowsNotNull (Tel) als Tel aus Tabellengruppe nach ID;

  | id | name | age | Tel 
------------------------------------------ 
     1 | 1 | Alex | 20  | 7834xx 

Was kann ich tun? Bitten?

+0

Was ist die erste Spalte? vor dieser ID? Haben Sie diese Spalte mit der Seriennummer? –

+0

Wie ist 20 die maximale Anzahl in der Altersspalte? Die Ergebnisse, nach denen Sie suchen, scheinen nicht mit den Daten übereinzustimmen. Gibt es eine weitere Anforderung? –

+0

ID ist Idenety-Spalte. –

Antwort

0
drop table if exists dbo.TableC; 

create table dbo.TableC (
Ident int primary key 
, Id int 
, name varchar(100) 
, age int 
, Tel varchar(100) 
); 

insert into dbo.TableC (Ident, Id, name, age, Tel) 
values (1, 1, 'Frank', 40, null) 
, (2, 1, null, 50, '7834xx') 
, (3, 1, 'Alex', null, null) 
, (4, 1, null, 20, null) 
, (5, 2, 'James', null, '4121xx'); 

select 
* 
from (
select 
    MIN(t.Ident) as Ident 
    , t.id 
from dbo.TableC t 
group by t.Id 
) t 
outer apply (
    select 
     top (1) 
     tn.name 
    from dbo.TableC tn 
    where tn.name is not null 
     and tn.Id = t.Id 
    order by tn.Ident desc 
) tname 
outer apply (
    select 
     top (1) 
     ta.age 
    from dbo.TableC ta 
    where ta.age is not null 
     and ta.Id = t.Id 
    order by ta.Ident desc 
) tage 
outer apply (
    select 
     top (1) 
     tt.tel 
    from dbo.TableC tt 
    where tt.Tel is not null 
     and tt.Id = t.Id 
    order by tt.Ident desc 
) ttel 
+0

Danke, es ist zu kompliziert! Ich denke es gibt einen anderen einfachen Weg, vielleicht: wähle id, lastRows! Null (name) als name, ... aus Table group by id; Ich brauche letzten ist nicht Null –