0

SQL を使用して、テーブル内の特定の値の合計を見つけようとしています。サンプル テーブルは次のとおりです。

+-------+-------+-------+-------+-------+-------+-------+
|  ID   |  Co1  |  Va1  |  Co2  |  Va2  |  Co3  |  Va3  |
+-------+-------+-------+-------+-------+-------+-------+
|  01   |  AA1  |   23.0|  AA2  |   11.2|  AA3  | 328.34|
|  02   |  AA2  |   27.0|  AA3  | 234.56|  AA4  |   23.8|
|  03   |  AA1  | 409.01|  AA4  | 234.98| NULL  | NULL  |
+-------+-------+-------+-------+-------+-------+-------+

そのような「コード」列と値が35あります。

必要なのは、コードが 1 つしかないテーブルを選択することです。コードAA3が必要だとすると、これは次のようになります(コード列はここでは必要ありませんが、値を取得した場所を示すためだけです):

+-------+-------+--------+
|  ID   | Code  |  Value |
+-------+-------+--------+
|  01   |  AA3  |  328.34|
|  02   |  AA3  |  234.56|
|  03   |  AA3  |       0|
+-------+-------+--------+

そして、後でコード AA1 と AA2 の合計など、いくつかのコードの合計を含む別の (別の) クエリが必要になります。

+-------+---------+
|  ID   |   Value |
+-------+---------+
|  01   |     34.2|
|  02   |     27.0|
|  03   |   409.01|
+-------+---------+

「WHERE」を使用して 35 列ごとに実行することを考えていましたが、それは本当に面倒で、あまり効率的ではないようです。SQLを介してそれを行う方法があるかどうか疑問に思っていました(ifステートメントを使用してExcelで行うことができ、驚くほどうまくいきます)。

行を「検索」する方法があった場合、列名を返し、その列名を使用して番号を取得しますか?

さらに情報が必要な場合はお知らせください =)

4

2 に答える 2

2

すべきことは、データを正規化された形式で保存することです。

でも...

select SUM(v)
from
(

select * -- ID, r, v 
from 
(select * from yourtable) u
unpivot
( r for co in (co1, co2, co3)) as u1
unpivot
(  v for va in (va1, va2, va3)) as u2
where RIGHT(co,1) = RIGHT(va,1)
) v
WHERE R = 'AA1' -- etc

あなたが求める結果を返します

于 2012-08-06T09:03:06.750 に答える
0

あなたのテーブル構造は理想的とは言えません。Excel ベースIFの方法に似た簡単な例を示してから、正規化されたデータ構造を使用したはるかに単純なクエリを示します。

SELECT
  id,
    CASE WHEN co1 = 'AA1' THEN co1 ELSE 0 END
  + CASE WHEN co2 = 'AA1' THEN co2 ELSE 0 END
  + CASE WHEN co3 = 'AA1' THEN co3 ELSE 0 END
  + CASE WHEN co4 = 'AA1' THEN co4 ELSE 0 END
  + etc, etc
FROM
  yourTable

ごとに 30 個のコードがあるため、30 個のステートメントidが必要です。CASE

id別の方法は、 ごとに複数の列ではなく、ごとに複数の行のデータを持つことidです。

+-------+-------+-------+-------+
|  ID   |  Obs  |  Cod  |  Val  |
+-------+-------+-------+-------+
|  01   |   1   |  AA1  |  23.0 |
|  01   |   2   |  AA2  |  11.2 |
|  01   |   3   |  AA3  | 328.34|
|  02   |   1   |  AA2  |   27.0|
|  02   |   2   |  AA3  | 234.56|
|  02   |   3   |  AA4  |   23.8|
|  03   |   1   |  AA1  | 409.01|
|  03   |   2   |  AA4  | 234.98|
+-------+-------+-------+-------+ 

クエリはシンプルで、テーブル構造を変更せずに好きなだけ観測を追加でき、その他にも多くの利点があります...

 Query if one id can have several           Query if one id can only have one
 observations for the same code:            observation for any one code:
----------------------------------         -----------------------------------
 SELECT                                     SELECT
   id,                                        *
   cod,                                     FROM
   SUM(val)   AS val                          yourTable 
 FROM                                       WHERE
   yourTable                                  cod = 'AA1'
 WHERE
   cod = 'AA1'
 GROUP BY
   id,
   cod
于 2012-08-06T09:25:54.363 に答える