2017-11-07 4 views
2

Ich habe mir den Kopf gebrochen, als ich versuchte, das herauszufinden, also würde hier etwas Hilfe sehr geschätzt werden.Gruppenzeilen mit ID aus einer bestimmten Zeile

Im Grunde habe ich eine Datenbanktabelle bekommt, zum Beispiel:

enter image description here

Ich versuche, das unten Ergebnis zu erhalten:

Id  | Name | Total 
------------------------ 
590954 | ABC | 825.00 

Also muß ich die ID aus der Reihe mit dem größten Wert für diese Gruppe (dh ABC), der Name und die Summe des Wertes (für diese Gruppe - ABC).

Es gibt viele weitere Zeilen mit unterschiedlichen Namen.

Vielen Dank im Voraus.

Edit (Hinzufügen einiger SQL zu helfen):

declare  @Test  table 
    (  Id   int 
    ,  Name  nvarchar(20) 
    ,  Value  decimal(10,2) 
    ) 

insert into @Test values (590954, 'ABC', 525) 
insert into @Test values (592332, 'ABC', 300) 
insert into @Test values (1, 'DEF', 100) 
insert into @Test values (2, 'DEF', 250) 

select * from @Test 

Das Ergebnis I ist diese 2 Zeilen zu erhalten bin versucht:

Id  | Name | Total 
------------------------ 
590954 | ABC | 825.00 
2  | DEF | 350.00 

Bitte helfen Sie mir die erforderliche Abfrage schriftlich anzuzeigen.

+0

Mit so viel rep, wie Sie Sie sollten wissen, dass wir etwas mit zu arbeiten haben möchten. Das bedeutet Beispieldaten und die gewünschte Ausgabe in einem Verbrauchsmaterialformat. Die Abfrage selbst ist hier ziemlich einfach. Es dauert länger, das Problem einzurichten und den Code zu schreiben. –

+1

ROW_NUMBER() (Partition nach Name Reihenfolge von VALUE DESC) –

Antwort

4

SQL DEMO

Sie können die folgende Abfrage versuchen:

select t1.id, t1.name, t2.Total 
from table1 t1 
join(SELECT name, MAX(Value) as max_Value, SUM(Value) as Total 
    FROM Table1 GROUP BY name) t2 
    on t1.name=t2.name and t1.Value=t2.max_Value 

Um zu verstehen, die Abfrage: Die abgeleitete Tabelle als t2 aliased, die die Felder name, max Value und die Summe der Value jeder Gruppe enthält. Dann wird es mit der Haupttabelle table1 mit dieser Bedingung t1.name=t2.name and t1.Value=t2.max_Value verbunden, die bestätigt, nur den Rekord auszuwählen, der das Maximum Value jeder Gruppe hat.

+0

@Richard - Berücksichtigen Sie [Was soll ich tun, wenn jemand meine Frage beantwortet?] (Https: // stackoverflow.com/help/someone-answer) wenn Ihr Problem gelöst ist. –

2

Hier ist ein Beispielcode ähnlich Ihrer Anforderung

Create table #temp2(id int,name varchar(3),val int) 
Insert into #temp2 values (1,'ABC',20),(2,'ABC',40),(3,'PQR',10),(4,'PQR',30),(5,'PQR',50) 

    Select id, name,Val from(
select id,name,Sum(val)over(partition by name) as Val,row_number()over(partition by name order by val desc)as Rn from #temp2)t 
where Rn=1 
+0

Wenn ich den Wert von 1 von 20 auf 10 ändern, dann bekomme ich auch die ID als 2 – Kapil

4

Diese normalerweise row_number() erfolgt über:

select t.* 
from (select t.*, row_number() over (partition by name order by value desc) as seqnum, 
      sum(value) over (partition by name) as sumvalue 
     from t 
    ) t 
where seqnum = 1; 
+0

@HoneyBadger. . . Das habe ich in der Frage vermisst. Es ist einfach hinzuzufügen. –

+1

Noch dies summiert "Value" wie erwartet. Vielleicht haben Sie diese Zeile immer noch nicht bemerkt. Also brauche ich die ID aus der Zeile mit dem größten Wert für diese Gruppe (dh ABC), dem Namen und der Summe des Wertes (für diese Gruppe - ABC). " –

1

Dies kann mit einer Fensterfunktion erfolgen. Ähnlich wie bei Gordon Linoff Antwort, aber ich änderte die Partition in der Summe (Wert), um die richtige Antwort zu bekommen:

select t.* 
    from (select t.*, row_number() over (partition by name order by value desc) as seqnum, 
     sum(value) over (partition by name) as sumvalue 
    from @Test t 
    ) t 
    where seqnum = 1; 
Verwandte Themen