Чтобы выбрать данные из нескольких записей в SQL Сервер, имеющий общий идентификатор - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно выбрать / объединить данные из 2 таблиц в SQL Сервер, который я использую Left Join, но данные возвращаются в виде нескольких записей.

Ниже приведены примеры таблиц

Table1
Id Name Age
1  Sk   20
2  Rb   30

Table2
ID Bike Price Table1Id
1  RX   200   1
2  CD   250   1
3  FZ   300   1
4  R1   400   2

The desired output is
ID Name Age Bike1 Price1 Bike2 Price2 Bike3 Price3
1  Sk   20  RX    200    CD    250    FZ    300
2  Rb   30  R1    400    NULL  NULL   NULL  NULL

Пример формата запроса, который я использую

SELECT A.ID, A.Name, B.Bike, B.Price FROM Table1 A LEFT JOIN Table2 B ON
A.id = B.Table1Id order by A.id

Вывод, который я получаю из приведенного выше запроса:

ID Name Age Bike Price
1  Sk   20  RX   200
1  Sk   20  CD   250
1  Sk   20  FZ   300
2  Rb   30  R1   400

Мне нужны данные в виде одной записи для определенного идентификатора, а не для нескольких записей (как видно из требуемого вывода). Надоело использовать смещение, но смещение будет возвращать только ограниченный результат, а не все записи.

Какие-либо предложения о том, как этого можно достичь?

1 Ответ

2 голосов
/ 21 апреля 2020

Если вы знаете максимальное количество велосипедов на человека, вы можете использовать условное агрегирование:

SELECT ID, Name,
       MAX(CASE WHEN seqnm = 1 THEN Bike END) as bike_1,
       MAX(CASE WHEN seqnm = 1 THEN Price END) as price_1,
       MAX(CASE WHEN seqnm = 2 THEN Bike END) as bike_2,
       MAX(CASE WHEN seqnm = 2 THEN Price END) as price_2,
       MAX(CASE WHEN seqnm = 3 THEN Bike END) as bike_3,
       MAX(CASE WHEN seqnm = 3 THEN Price END) as price_3
FROM (SELECT A.ID, A.Name, B.Bike, B.Price,
             ROW_NUMBER() OVER (PARTITION BY A.id ORDER BY B.Price) as seqnum
      FROM Table1 A LEFT JOIN
           Table2 B 
           ON A.id = B.Table1Id 
     ) ab
GROUP BY ID, Name,
ORDER BY id
...