Строго говоря, SQL-ответ на эту проблему: «Это проблема отображения. Дисплей - проблема приложения, а не проблема с базой данных». Реляционно говоря, это также просит сервер нарушить первую нормальную форму и создать повторяющиеся группы, а это означает, что почти наверняка потребуется перепрыгнуть через несколько обручей и будет иметь значительные ограничения.
«Правильный путь» в соответствии с DBA будет делать что-то вроде:
SELECT pid, id, val1, val2, val3
FROM Table
ORDER BY pid, id;
Затем в вашем приложении, ходить через результирующий набор и форматирование вывода, как вам нужно.
Можно даже включить для каждого id
в пределах pid
приказ может быть, сделать это немного проще:
SELECT pid,
id,
val1,
val2,
val3,
ROW_NUMBER() OVER (PARTITION BY pid, ORDER BY id) AS "id_order"
FROM Table
ORDER BY pid, id;
Однако, предположим, что вы не можете сделать это.
Если вы абсолютно имеют сделать это с помощью SQL (например, ваше программное обеспечение отчетности не обрабатывает такого рода вещи, и все это у вас есть), и вы знаете, что вы никогда не более 3 id
для каждого pid
, вы можете попробовать что-то вроде этого:
;WITH Table_id_ordered AS (
SELECT pid,
id,
val1,
val2,
val3,
ROW_NUMBER() OVER (PARTITION BY pid, ORDER BY id) AS "id_order"
FROM Table
)
SELECT t1.pid,
t1.id as id_1,
t1.val1 as val1_1,
t1.val2 as val2_1,
t1.val3 as val3_1,
t2.id as id_2,
t2.val1 as val1_2,
t2.val2 as val2_2,
t2.val3 as val3_2,
t3.id as id_3,
t3.val1 as val1_3,
t3.val2 as val2_3,
t3.val3 as val3_3
FROM Table_id_ordered t1
LEFT JOIN Table_id_ordered t2
ON t2.pid = t1.pid
AND t2.id_order = t1.id_order + 1
LEFT JOIN Table_id_ordered t3
ON t3.pid = t2.pid
AND t3.id_order = t2.id_order + 1
WHERE t1.id_order = 1;
Очевидно, что это хорошо только до трех id
для любого pid
,. Как написано, он также не скажет вам, есть ли в вашей таблице id
, который был бы в первом или пятом. Они просто полностью отсутствуют в результатах. Первый метод, который я упомянул, всегда будет возвращать все данные, и приложение может быть написано для обработки этого довольно легко.
Динамические решения могут быть созданы для любого количества id
s для pid
, но это значительно сложнее.
почему вторая строка в результате? –
@GiorgiNakeuri sry, вторая строка ошибочна в результате. – hunt3r87