Member 10017141 Ответов: 1

Как выбрать одну строку из нескольких строк и (повторных) coulumns в SQL


i have a sample Table :

ID      T_art   Z_art  F_ID

2101    s       w      2
2101    a       z      1
2101    s       r      3
2102    s       w      4
2102    a       z      5


i want the result set like this:(Order By F_ID)

ID     T_art    Z_art  T_art    Z_art     T_art   Z_art

2101   a         z       s        w         s       r
2102   s         w       a        z


Что я уже пробовал:

есть ли какой-нибудь способ добиться этого в sql? это срочно.любая помощь действительно ценится.
Спасибо.

1 Ответов

Рейтинг:
12

Wendelius

Во-первых, один SQL-запрос возвращает фиксированное количество столбцов. Это означает, что вы либо должны знать количество столбцов в результате и строить запрос на основе этого, либо вам нужно построить запрос динамически после получения информации о том, сколько столбцов вам нужно.

В обоих случаях один из способов-использовать PIVOT. Взгляните на следующие примеры:
- Простой способ использования Pivot в SQL-запросе[^]
- Динамический сводный запрос в SQL Server[^]

ДОПОЛНЕНИЕ
Если я правильно понимаю логику, которую вы описали, вы можете просто включить таблицу 8 раз в свой запрос, используя внешнее соединение. Например что-то вроде

SELECT a.fk_PordId, 
       a.fk_Transport, 
       a.fk_Destination,
       b.fk_Transport, 
       b.fk_Destination,
       c.fk_Transport, 
       c.fk_Destination
       -- continue to complete 8 tables
FROM MyTableName a
LEFT OUTER JOIN MyTableName b 
   ON (    b.fk_PordId = a.fk_PordId 
       AND b.fk_id     > a.fk_id  
       AND NOT EXISTS (SELECT 1 
                       FROM MyTableName b1 
                       WHERE b1.fk_PordId = b.fk_PordId 
                       AND   b1.fk_id     > a.fk_id 
                       AND   b1.fk_id     < b.fk_id))
LEFT OUTER JOIN MyTableName c
   ON (    c.fk_PordId = b.fk_PordId
       AND c.fk_id > b.fk_id
       AND NOT EXISTS (SELECT 1 
                       FROM MyTableName c1 
                       WHERE c1.fk_PordId = c.fk_PordId 
                       AND   c1.fk_id     > b.fk_id
                       AND   c1.fk_id     < c.fk_id))
-- continue to complete 8 tables
WHERE NOT EXISTS (SELECT 1 
                  FROM MyTableName a1 
                  WHERE a1.fk_PordId = a.fk_PordId
                  AND   a1.fk_id     < a.fk_id)


Member 10017141

Спасибо, что предложили ссылки, но это не решает мою проблему.
моя фактическая таблица выглядит следующим образом:
fk_id fk_PordId fk_Transport fk_Destination
1 80990 с Вт
2 80990 Z A
3 81230 f A
4 81230 s z

я должен исправить ряд coulmns. мне нужно 8 столбцов fk_Transport и 8 столбцов fk_Destination. это означает, что максимальный тип значений в обоих кулонах равен 8.

мне нужен такой результат:

fk_PordId fk_Transport fk_Destination fk_Transport fk_Destination
80990 ь ю з а
81230 f A s z
это означает, что я хочу показать для одного fk_ProdId все типы fk_Transporttype и fk_Destination(до 8 репитив-столбцов) в одной строке, которые тоже упорядочиваются по fk_id.

Wendelius

См. обновленный ответ

Member 10017141

Я получил свое решение с небольшими изменениями ...мне потребовалось чертовски много времени, чтобы получить желаемый результат..ты спаситель :)

Wendelius

Рад, что это помогло :)