1

私はこのようなSQLビューを持っています:

id date_from  date_to
1  2005-01-05 2005-05-10
1  2005-01-05 2005-05-10
1  2005-01-05 2005-05-10
2  2005-01-01 2006-08-31
2  2010-01-01 2010-06-30
3  2005-01-01 2005-06-30

そして、私は以下を返すSQLステートメントを書きたいと思います:

1 2005-01-05 2005-05-10 2005-01-05 2005-05-10 2005-01-05 2005-05-10
2 2005-01-01 2006-08-31 2010-01-01 2010-06-30 NULL       NULL
3 2005-01-01 2005-06-30 NULL       NULL       NULL       NULL

何か案は?

4

2 に答える 2

1

最近の質問は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;

幸運を祈ります。

于 2013-02-12T17:40:01.120 に答える
1

マークの質問への回答が役立ちます。

これはどのRDBMSですか?MySQL、Oracle、SQLServer ...?また、IDごとに3つ以上のdate_from、date_toペアが必要になることはありますか?

t-sqlを使用して、3つのレベルを明示的に処理します。動的にする場合は、クエリを動的に作成する必要があります。

DECLARE @staging TABLE
(
    id int NOT NULL,
    date_from datetime NOT NULL,
    date_to datetime NOT NULL,
    step int
)

INSERT INTO @staging
SELECT id, date_from, date_to,
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY date_from, date_to)
FROM tblTemp

-- below is static for 3 levels, make below dynamic to match what you want
SELECT t1.id, t1.date_from, t1.date_to, t2.date_from, t2.date_to, t3.date_from, t3.date_to
FROM @staging t1 LEFT OUTER JOIN
    @staging t2 ON t1.id = t2.id AND t2.step = 2 LEFT OUTER JOIN
    @staging t3 ON t2.id = t3.id AND t3.step = 3
WHERE t1.step = 1

テスト@http ://sqlfiddle.com/#!3 /9daae/4/0

于 2013-02-12T17:53:36.127 に答える