Для каждого отображения в одной строке SQL Server - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь создать одну строку, содержащую номер сборки и каждый компонент.

У меня есть таблица с именем Assembly с уникальным идентификатором, который можно привязать к таблице inv_mast кака также компоненты в этой таблице, которые могут быть привязаны к той же таблице inv_mast.Он также включает порядковый номер.

inv_mast_uid |  sequence_number |   component_inv_mast_uid

453061       | 1                | 453024
453061       | 2                | 453017
453061       | 3                | 453020
453062       | 1                | 453019
453062       | 2                | 453027

(Некоторые из моих записей содержат только 2 компонента)

Я пытаюсь достичь:

inv_mast_uid |  component_inv_mast_uid_1 |  component_inv_mast_uid_2    | component_inv_mast_uid_3
453061       | 453024                    | 453017                       | 453020    
453062       | 453019                    | 453027                       | Null  

Iдумал, что я буду использовать цикл «Для каждого», но мне никогда не везло с этим и SQL Server

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Если можно определить максимальное значение столбцов, то что-то вроде этого должно работать

select (select A.component_inv_mast_uid 
          from Assembly where inv_mast_uuid = A.inv_mast_uuid and sequence_number = 1) as component_inv_mast_uid_1,
       (select A.component_inv_mast_uid 
          from Assembly where inv_mast_uuid = A.inv_mast_uuid and sequence_number = 2) as component_inv_mast_uid_2,
       (select A.component_inv_mast_uid 
          from Assembly where inv_mast_uuid = A.inv_mast_uuid and sequence_number = 3) as component_inv_mast_uid_3
from (select distinct inv_mast_uid from Assembly) A

Это также может быть улучшено динамическим построением запроса.

0 голосов
/ 28 сентября 2018

То, что вы пытаетесь сделать, называется Pivot, поэтому я надеюсь, что это поможет вам

SELECT INV_MAST_UID
     ,[1] AS COMPONENT_INV_MAST_UID_1
     ,[2] AS COMPONENT_INV_MAST_UID_2
     ,[3] AS COMPONENT_INV_MAST_UID_3
FROM Assembly
PIVOT 
(
    MAX(COMPONENT_INV_MAST_UID)
    FOR sequence_number IN([1],[2],[3]) 
) as pvt 

Если вы хотите проверить документацию Microsoft. Сводная таблица в Sql Server

Привет

0 голосов
/ 28 сентября 2018

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

declare @Assembly table
(
    inv_mast_uid int
    , sequence_number int
    , component_inv_mast_uid int
)

insert @Assembly values
(453061, 1, 453024)
, (453061, 2, 453017)
, (453061, 3, 453020)
, (453062, 1, 453019)
, (453062, 2, 453027)

select inv_mast_uid
    , component_inv_mast_uid_1 = max(case when sequence_number = 1 then component_inv_mast_uid end)
    , component_inv_mast_uid_2 = max(case when sequence_number = 2 then component_inv_mast_uid end)
    , component_inv_mast_uid_3 = max(case when sequence_number = 3 then component_inv_mast_uid end)
from @Assembly
group by inv_mast_uid
order by inv_mast_uid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...