2016-10-04 3 views
1

, когда я присоединяюсь к таблице два раза для получения разных данных из таблицы 2, если в таблице два получаются разные данные счетчика строк, некоторые столбцы дублируются.повторяющийся столбец при объединении таблицы дважды

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 

и я получаю эту resoult

enter image description here

+0

лучше, если вы показываете вашу исходную таблицу и требуемую таблицу –

ответ

1

Попробуйте это:

;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 

First CTE (part1) собирает данные для section='print', второй - для section='laminate1'. И добавим ROW_NUMBER(). Затем присоедините два CTE.

Еще один способ:

;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

спасибо @ gofr1 но есть ли укоротить способ сделать это, я должен использовать эти коды в другом большом коде, который я должен используйте это 5 раз и еще один столбец из таблицы порядок, который становится все больше и больше –

+0

Я добавляю еще один способ, пожалуйста, попробуйте. – gofr1

+0

спасибо @ gofr1, но я ищу другой способ, а не использовать cte, есть ли другой способ? –

 Смежные вопросы

  • Нет связанных вопросов^_^