最近の質問はMySQLに関連しているので、MySQLソリューションが必要だと思います。
潜在的な日付範囲の最大数がわかっている場合は、MAXとCASEを使用できます。ただし、他に一意の識別子がないため、行カウンターが必要です(これはビューであると言っているので、実際にはビューに追加することをお勧めします)。ここにあります:
SELECT Id,
MAX(CASE WHEN row_number = 1 THEN date_from END) date_from1,
MAX(CASE WHEN row_number = 1 THEN date_to END) date_to1,
MAX(CASE WHEN row_number = 2 THEN date_from END) date_from2,
MAX(CASE WHEN row_number = 2 THEN date_to END) date_to2,
MAX(CASE WHEN row_number = 3 THEN date_from END) date_from3,
MAX(CASE WHEN row_number = 3 THEN date_to END) date_to3
FROM (
SELECT
id,
@running:=if(@previous=id,@running,0) + 1 as row_number,
@previous:=id,
date_from, date_to
FROM YourView
JOIN (SELECT @previous := 0) r
ORDER BY id, date_from, date_to
) t
GROUP BY Id
日付範囲の最大数がわからない場合は、単一のSQLステートメントでこれを行うことはできません。代わりに、動的SQLを使用する必要があります。
私はあなたがrow_numberをあなたのビューに追加できると仮定します、そしてここに近い例があります:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN row_number = ',
row_number,
' THEN date_from END) date_from',
row_number)
),
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(CASE WHEN row_number = ',
row_number,
' THEN date_to END) date_to',
row_number)
) INTO @sql
FROM YourView;
SET @sql = CONCAT('SELECT ID, ',
@sql, '
FROM YourView
GROUP BY ID');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
幸運を祈ります。