因爲你最近的問題都與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;
好運。
其中RDBMS是這樣的 - MySQL和甲骨文,SQLServer的......?此外,你是否會想要每個ID超過三個date_from,date_to對? – 2013-02-12 17:16:59
從你在標題和標籤中放置「pivot」的事實來看,你顯然已經有了一個想法,顯然它不起作用。它出了什麼問題?而且,你正在使用什麼DBMS? – ruakh 2013-02-12 17:17:35
我正在使用Teradata。視圖在同一個案例中可以有3個以上的日期,但我想使用3個最新的日期。 – 2013-02-12 18:47:39