2016-10-04 2 views
1

wenn ich eine Tabelle zwei Mal für verschiedene Daten aus Tabelle zwei, wenn Tabelle zwei verschiedene Zeilenanzahl Daten einige Spalte doppelt sein.doppelte Spalte, wenn eine Tabelle zweimal verbinden

select 
o.order_no 
,sr.reason as reason1 
,datediff(minute,s.begin_stop,s.end_stop) as s1 
,sr2.reason as reason2 
,datediff(MINUTE,s2.begin_stop,s2.end_stop) as s2 
from [order] o 
left join [stops] s on s.order_id=o.id and s.section='print' 
join [stopreason] sr on s.error_code=sr.code 
left join [stops] s2 on s2.order_id=o.id and s2.section='laminate1' 
join [stopreason] sr2 on sr2.code=s2.error_code 
where datepart(ww,o.date_onexit)=39 
order by order_no 

und ich dieses resoult

enter image description here

+0

besser, wenn Sie Ihre erste Tabelle und erforderliche Tabelle –

Antwort

1

Try this one:

;WITH part1 AS (
    select o.order_no, 
      sr.reason as reason1, 
      datediff(minute,s.begin_stop,s.end_stop) as s1, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.order_no) rn 
    from [order] o 
    left join [stops] s 
     on s.order_id=o.id and s.section='print' 
    join [stopreason] sr 
     on s.error_code=sr.code 
    where datepart(ww,o.date_onexit)=39 
), part2 AS (
    select o.order_no, 
      sr2.reason as reason2, 
      datediff(MINUTE,s2.begin_stop,s2.end_stop) as s2, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.order_no) as rn 
    from [order] o 
    left join [stops] s2 
     on s2.order_id=o.id and s2.section='laminate1' 
    join [stopreason] sr2 
     on sr2.code=s2.error_code 
    where datepart(ww,o.date_onexit)=39 
) 

SELECT p1.order_no, 
     p1.reason1, 
     p1.s1, 
     p2.reason2, 
     p2.s2 
FROM part1 p1 
LEFT JOIN part2 p2 
    ON p1.order_no = p2.order_no AND p1.rn = p2.RN 
order by p1.order_no 

erste CTE (part1) sammelt Daten für section='print', zweite - für section='laminate1'. Und wir fügen ROW_NUMBER() hinzu. Dann treten Sie zwei CTEs bei.

Eine weitere Möglichkeit:

;WITH part1 AS (
    select o.order_no, 
      sr.reason as reason, 
      datediff(minute,s.begin_stop,s.end_stop) as s, 
      s.section, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no,s.section ORDER BY o.order_no) rn 
    from [order] o 
    left join [stops] s 
     on s.order_id=o.id and (s.section='print' or s.section='laminate1') 
    join [stopreason] sr 
     on s.error_code=sr.code 
    where datepart(ww,o.date_onexit)=39 
) 

SELECT p1.order_no, 
     p1.reason1, 
     p1.s1, 
     p2.reason2, 
     p2.s2 
FROM part1 p1 
LEFT JOIN part1 p2 
    ON p1.order_no = p2.order_no AND p1.rn = p2.RN AND p2.section='laminate1' 
WHERE p1.section='print' 
order by p1.order_no 
+0

dank @ gofr1 zeigen aber gibt es einen shorten Weg, dies zu tun, ich diese Codes in einem anderen größeren Code, dass ich verwenden soll Verwenden Sie diese 5 Mal und eine andere Spalte aus der Tabelle Reihenfolge, die größer und größer –

+0

Ich füge einen weiteren Weg, bitte, versuchen Sie es. – gofr1

+0

danke @ Gofr1 aber ich suche nach einem anderen Weg, nicht cte verwenden, gibt es einen anderen Weg? –

Verwandte Themen