共通のインデックスとして「ピリオド」を使用して、HとTの価格に別々の列を作成したいと思います。私がこれについてどうすべきかについての提案はありますか?
これは私のSQLクエリが現時点で生成するものです:
GROUP BY
次のように、条件付きを使用できます。
SELECT
period
, SUM(CASE NAME WHEN 'H' THEN price ELSE 0 END) as HPrice
, SUM(CASE NAME WHEN 'T' THEN price ELSE 0 END) as TPrice
FROM MyTable
GROUP BY period
次のことができます。
SELECT period,
max(CASE WHEN name = 'H' THEN price END) as h_price,
max(CASE WHEN name = 'T' THEN price END) as t_price
FROM myTable
GROUP by period
これについてはゲームに少し遅れていますが、データをピボットすることもできます。
サンプルテーブルを作成しましょう。
CREATE TABLE myData(period int, price decimal(12,4), name varchar(10))
GO
-- Inserting Data into Table
INSERT INTO myData
(period, price, name)
VALUES
(1, 53.0450, 'H'),
(1, 55.7445, 'T'),
(2, 61.2827, 'H'),
(2, 66.0544, 'T'),
(3, 61.3405, 'H'),
(3, 66.0327, 'T');
次に、ピボットを実行して選択します。
SELECT period, H, T
FROM (
SELECT period, price, name
FROM myData) d
PIVOT (SUM(price) FOR name IN (H, T)) AS pvt
ORDER BY period
この手法は、テーブルのヘッダーに表示される列を取り込む動的SQLスクリプトを作成する必要がある場合に使用しました。ケースステートメントは必要ありません。
ケースとピボットのパフォーマンスについてはよくわかりません。たぶん、もう少し経験のある人が、より良いパフォーマンスを与えるコメントを追加することができます。
テーブルを再作成するつもりなら?
1)期間、price_h、price_tの列を持つ新しいテーブルを作成します。
2)すべての(個別の)期間を新しいテーブルの期間にコピーします。
3)name = Hであるすべての価格を、期間列に参加している新しいテーブルのprice_hにコピーします。
4)price_t....に対して3を繰り返します。
幸運を!