2016-10-19 2 views
0

Wenn ich ein paar Tische haben wie die folgendeBegrenzung Join Anzahl

Table1 
----------------------------- 
Name      Qty 
----------------------------- 
John      1 
Paul      2 
       ... 
Ringo      1 

und

Table2 
----------------------------- 
Forename Surname  Cost 
----------------------------- 
John  Smith  123 
John  Jones  815  
Paul  Smith  273 
Paul  Jones  297 
      ... 
Ringo  Smith  755 
Ringo  Jones  334 

und ich möchte eine Abfrage erstellen, so dass die Menge von Table2 zurück von jeder Teilmenge bestellt wird durch Table2.Cost und begrenzt durch Table1.Qty, zurückzukehren etwas wie:

Results 
----------------------------- 
Forename Surname  Cost 
----------------------------- 
John  Jones  815 
Paul  Jones  297 
Paul  Smith  273 
Ringo  Smith  755 

gibt es eine Möglichkeit, dies zu tun?

+1

Was ist die Logik Ihres Ergebnisses? Könnten Sie Ihre Anfrage schreiben und lassen Sie uns Fehler melden – Ravi

+0

@Ravi ist nicht einfach zu sehen, aber er will die teuersten Jhon, die Top 2 teuersten Pauls, und die teuersten Ringo. –

Antwort

0
SELECT Forename, 
     Surname, 
     Cost 
    FROM 
    (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY Forename ORDER BY Cost DESC) 
       AS rn 
      FROM Table2 
    ) 
WHERE rn = 1; 
+0

Ihre Abfrage einen Datensatz von Paul –

2

Versuchen Sie dieses

SELECT T.Forename,T.Surname, T.Cost 
    FROM 
    (
     SELECT *, 
       ROW_NUMBER() OVER (PARTITION BY Forename ORDER BY Cost DESC) 
       AS rn 
      FROM Table2 
    ) T 
JOIN Table1 ON Table2.Foreman=Table1.Name 
WHERE T.rn <=Qty; 
+0

Danke, das funktioniert gut –

0

aktualisiert und getestet: Wenn es um die höchst Kosten von Tabelle 2 auf je bekommen Menge von Tabelle 1, dann die Verwendung folgenden :

CREATE TABLE #table1 (name NVARCHAR(100), qty INT); 
CREATE TABLE #table2 (forename NVARCHAR(100), surname NVARCHAR(100), cost INT); 

INSERT INTO #table1 VALUES 
('John', 1), 
('Paul', 2), 
('Ringo', 1); 

INSERT INTO #table2 VALUES 
('John', 'Smith', 123), 
('John', 'Jones', 815), 
('Paul', 'Smith', 273), 
('Paul', 'Jones', 297), 
('Ringo', 'Smith', 755), 
('Ringo', 'Jones', 334); 

WITH DATA AS (
SELECT t2.forename, t2.surname, t2.cost, t1.qty, 
rn = ROW_NUMBER() OVER (PARTITION BY t1.name ORDER BY t2.cost DESC) 
FROM 
    #table1 t1 
    INNER JOIN #table2 t2 ON t1.name = t2.forename 
) 
SELECT d.forename, d.surname, d.cost 
    FROM 
DATA d 
WHERE d.rn <= d.qty 
+0

Danke, das funktioniert gut –

0
create table #table1(name varchar(100), qty int) 
create table #table2 (forename varchar(100), surname varchar(100), cost int) 

insert into #table1 values 
('John',1), 
('Paul',2), 
('Ringo',1) 

insert into #table2 values 
('John' ,  'Smith'  , 123), 
('John' , 'Jones' , 815) , 
('Paul' ,  'Smith' , 273), 
('Paul' ,  'Jones' , 297), 
('Ringo' ,  'Smith' , 755), 
('Ringo' ,  'Jones' , 334) 

select * from 
#table1 t1 cross apply 
    (select top (t1.qty) * from #table2 t2 where t1.name = t2.forename order by t2.cost desc) t 
+0

Dank Shishir, das funktioniert gut - sehr prägnant zu. –

Verwandte Themen