2017-11-15 14 views
1

tableBのセルの値がtableAの列名への参照であるテーブルを更新したいとします。Mysql列名とフィールド値に基づいてテーブルを結合する

TableA 
Dates  | f1 | f2 | f3 
1-1-2017 | 1 | 2 | 0  
2-1-2017 | 1 | 3 | 2  
3-1-2017 | 0 | 0 | 4  
4-1-2017 | 0 | 1 | 2 

のようなものです

TableA 
Dates  | f1 | f2 | f3 
1-1-2017 | 0 | 0 | 0  
2-1-2017 | 0 | 0 | 0  
3-1-2017 | 0 | 0 | 0  
4-1-2017 | 0 | 0 | 0 

TableB 
Dates  | Label | Counter 
1-1-2017 | f1  | 1 
1-1-2017 | f2  | 2 
2-1-2017 | f1  | 1 
2-1-2017 | f2  | 3 
2-1-2017 | f3  | 2 
3-1-2017 | f2  | 4 
4-1-2017 | f3  | 2 
4-1-2017 | f2  | 1 

所望の出力:

既存のテーブル:既存のテーブルと所望の出力の例を下回るように説明するの少し難しいですこれはmysqlで可能ですか?

+0

タイトルsaisクロステーブルが更新されましたが、希望の出力に参加していることがわかりますか?私にとってはあなたが作成したいビューのように見える –

+0

まず、あなたのDBデザインは適切ではありません。それが常にテーブルAの3つの属性であれば、ハードコーディングされたクエリによってテーブルAを更新できます。 – Jack

+0

@WernerWaageタイトルを更新しました。 – Nebu

答えて

1

このコードでは、出力結果と同じ結果が得られますが、結果は直接更新できません(通常はTableBを更新します)。 また、特定の日付のカウントがない場合は、その日、あなたはこれについてあなたの日付表に参加したいかもしれません。

SELECT A.Dates 
,SUM(CASE WHEN Label = 'f1' THEN Counter ELSE 0 END) AS f1 
,SUM(CASE WHEN Label = 'f2' THEN Counter ELSE 0 END) AS f2 
,SUM(CASE WHEN Label = 'f3' THEN Counter ELSE 0 END) AS f3 
FROM TableA A 
LEFT JOIN TableB B ON B.Dates = A.Dates 
GROUP BY A.Dates 
+0

日付範囲を順次にしたい。たとえば、ラベルf3が3-1-2017のレコードでない場合、レコードは返されません。このような状況では、0の値を持つレコードが返されます。 – Nebu

+0

TableAを値で更新しますか?または、ビュー/クエリでそれを持つことは大丈夫ですか?私はそれが日付表であるかのようにTableAに参加しました。あなたはこの目的のために日付表を使用する人を見てみるべきです。 –

+0

ビュー/クエリは大丈夫です。 – Nebu

関連する問題