1

dtSQL Server 2008 データベースに、indx_nm、およびの 3 つの列を持つテーブルがあります。indx_val

私が実行すると:

SELECT * 
FROM table1 a
WHERE a.indx_nm = 'ABQI' OR a.indx_nm = 'ACNACTR'
ORDER BY indx_nm, dt

私は次のようなものを取得します(3000の値からランダムに8つを選択するだけです)

    # dt--------------indx_nm----------------indx_val
    2009-06-08---------ABQI------------------1001.25
    2009-06-09---------ABQI------------------1002.12
    2010-06-08---------ABQI------------------928.76
    2011-06-10---------ABQI------------------959.97
    2009-06-08--------ACNACTR----------------300.05
    2009-06-09--------ACNACTR----------------341.19
    2010-04-08--------ACNACTR----------------428.26
    2011-07-10--------ACNACTR----------------509.48

次のような結果を返す方法はありますか

    # dt---------indx_nm1-----indx_val1-------indx_nm2------indx_val2
    2009-06-08----ABQI------1001.2------------ACNACTR----------300.05
    2009-06-09----ABQI------1002.12 ----------ACNACTR----------341.19

インデックス番号間で共有された日付を本質的に一致させてから、他方indx_nmを結合し、その結果に対応indx_valしますか?

*補遺

ABQIだから私はとの間の共分散を見つけようとしていますACNACTRindx_val1全体の平均と全体の平均を取ることができることはわかっていますが、index_val21000 行以上のセット全体をループして、(xi-x)(yi- y) / n おそらく vba でこれをもっと簡単に行うことができますが、それを処理できるとは思いません (共分散を決定したい数百の indx_nm があります)indx_val1indx_val2

4

1 に答える 1

2

これを達成するために、集計と をGROUP BY dt組み合わせて、NULL を含む複数の行を 1 つの行に折りたたんで正しい列を返すことができます。MAX()CASE

SELECT 
  dt,
  MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_nm ELSE NULL END) AS indx_nm1,
  MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_val ELSE NULL END) AS indx_val1,
  MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_nm ELSE NULL END) AS indx_nm2,
  MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_val ELSE NULL END) AS indx_val2
FROM table1 a
GROUP BY dt
ORDER BY dt

ここにデモがあります: http://sqlfiddle.com/#!6/2ec65/1

集計がなければ、whereまたは the pairのMAX()値ごとに 2 つの行ができてしまいます。次に、集約は null 値と null 以外の値の「最大」を選択し、1 つのグループ化された行を 1 つにまとめます。dtABQIANACTRNULLMAX()dt

ここで、両方が設定されている (s がない)値のみを返したい場合は、上記をサブクエリでラップするだけです。dtindx_nmNULL

SELECT * FROM (
    SELECT 
      dt,
      MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_nm ELSE NULL END) AS indx_nm1,
      MAX(CASE WHEN indx_nm = 'ABQI' THEN indx_val ELSE NULL END) AS indx_val1,
      MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_nm ELSE NULL END) AS indx_nm2,
      MAX(CASE WHEN indx_nm = 'ACNACTR' THEN indx_val ELSE NULL END) AS indx_val2
    FROM table1 a
    GROUP BY dt
) indxs
WHERE
  /* Discard those rows where either pair is NULL */
  indx_nm1 IS NOT NULL
  AND indx_nm2 IS NOT NULL
ORDER BY dt

編集おっと、その誤ったWHERE条項はそこにあるべきではありませんでした。

于 2013-08-01T20:25:55.280 に答える