1

私はこの問題について頭を悩ませてきました。私は既存のデータセットで作業しており、テーブル A の列からすべての null 値を削除し、それらをシャントして、テーブル B のように並べ替える必要があります。

Coalesce と同等のものが必要ですが、n 番目の値を取得して、テーブル B のように並べ替えられた結果を得ることができます

私が持っているもの:

表 A

Name CURRENT OCT12 SEPT12 AUG12 JUL12 JUN12  MAY12 APR12
---------------------------------------------------------
A    NULL    NULL  Aug-12 NULL  NULL  Jun-12 NULL  Apr-12
B    Nov-12  NULL  Aug-12 NULL  Jul-12Jun-12 NULL  Apr-12

必要なもの:

表 B

Name Change1 Change2 Change3 Change4 Change5 Change6
----------------------------------------------------
A    Aug-12  Jun-12  Apr-12  NULL    NULL    NULL   
B    Nov-12  Aug-12  Jul-12  Jun-12  Apr-12  NULL

コード的には、次のようになります。

Select

first non-null value as Change1  
,second non-null value as Change2  
,third non-null value as Change3  
,fourth non-null value as Change4  
,fifth non-null value as Change5...etc..  

from Table_A

私は MySQL を使用していますが、n 番目の非 null 値を参照して Table_B に呼び出す方法がわかりません。

誰にもアイデアはありますか?

4

2 に答える 2

0

このソリューションの使用をお勧めするかどうかはわかりません...データの正規化は常により良い選択ですが、いくつかの文字列関数を含むプレーンSQLを使用して答えたかったのです。このクエリは、探しているものを返す必要があります。

SELECT
  Name,
  Changes,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 1)), ',', 1)) as Change1,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 2)), ',', 1)) as Change2,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 3)), ',', 1)) as Change3,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 4)), ',', 1)) as Change4,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 5)), ',', 1)) as Change5,
  REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(Changes, ',', 6)), ',', 1)) as Change6
FROM (
  SELECT
    Name,
    CONCAT_WS(',', CURRENT, OCT12, SEPT12, AUG12, JUL12, JUN12, MAY12, APR12, ',') as Changes
  FROM
    TableA
) s

すべての値をコンマ区切りの文字列に連結し、文字列の最後に 2 つのコンマを付けます (とにかく 1 つのコンマで十分ですが、2 つ入れて最後のコンマを無視する方が簡単です...)。 m CONCAT_WS を使用すると、null 値が自動的にスキップされ、結果の文字列は次のようになりますAug-12,Jun-12,Apr-12,,

次に、外側のクエリで、SUBSTRIG_INDEX を使用して、文字列の n 番目の要素を抽出しています。データベースを正規化することをお勧めしますが、迅速な修正が必要な場合は、このソリューションが出発点として適している可能性があります。

ここで動作することを確認してください。

変更がない場合に NULL 値を返すのではなく、空の文字列を返すことに注意してください。これは、必要に応じて変更できます。

于 2013-01-29T09:03:52.910 に答える