0

テーブルを次のように持つ:

Year   Month   Value
2011   1       500
2011   2       550
2011   3       600
...
...
2012   1       600
2012   2       750
2012   3       930

同じ月/異なる年の値の差を計算できる方法はありますか?結果を次のように取得します:

Month    Value
1        100
2        200
3        330
...

私は次のようなことをしようとしました:

select month, a.value-b.value
from
  (select month, value from table where year = 2012) a,
  (select month, value from table where year = 2011) b

ただし、出力は 12 か月 (選択 a (2012) の * 選択 b (2011) の 12 か月) です。


編集: 重要な情報が不足していて申し訳ありません:

クエリは、odbc:jdbc ブリッジを介して Excel シートに対して行われています。

「from」句は常に次のようになっているため: [sheet1$] 結合またはケースを作成できません:(

4

7 に答える 7

3

あなたは結果を得る方法に非常に近かった。データを列にピボットするこれに似たものを使用することをお勧めします。その後、各年の差を取ることができます。

select month,
  Year2012-Year2011 as Diff
from
(
  select month,
    sum(case when year = 2011 then value end) Year2011,
    sum(case when year = 2012 then value end) Year2012
  from yourtable
  group by month
) src     

デモで SQL Fiddle を参照してください

于 2013-02-21T13:00:45.090 に答える
1

CROSS JOINテーブルに対して(のために)を実行しているため、クエリは機能しません。,したがって、各行は、月ではなく、他のテーブルのすべての行と一致しますINNER JOIN

クエリの変更:

select a.month, a.value-b.value
from
  (select month, value from table where year = 2012) a
  JOIN
  (select month, value from table where year = 2011) b
  ON a.month = b.month

より高速なクエリ:

select a.month, a.value-b.value
from
  yourTable a
  join yourTable b
    on a.month = b.month
  where a.year = 2012 and b.year = 2011

各年の月ごとの複数の行の場合:

select a.month, a.value-b.value
from
  (select month, sum(value) as value
   from yourTable where year = 2012
   group by month) a
  join
  (select month, sum(value) as value
   from yourTable where year = 2011
   group by month) b
    on a.month = b.month

SQLFiddle

于 2013-02-21T13:01:29.487 に答える
1

このようなもの?year/monthが一意であると仮定します。

SELECT
    a.month,
    a.value - b.value
FROM
    tablename a
    INNER JOIN tablename b
        ON a.year - 1 = b.year
        AND a.month = b.month
于 2013-02-21T13:01:56.680 に答える
1

whereクエリに句を追加するだけです..

select month, a.value-b.value
from
  (select month, value from table where year = 2012) a,
  (select month, value from table where year = 2011) b
where a.month = b.month

あなたがしているのはクロス結合であり、最初のテーブルの各行と2番目の列の各行を組み合わせて、異なる月番号と一致した行を除外します。

于 2013-02-21T13:58:51.820 に答える
0

さらに、例のように1か月に2つの値しかなく、SQLのバージョンで分析関数を使用できる場合は、これが機能します。別の方法で分割することができます...:

SELECT distinct month, (l_val - f_val) value
  FROM
  (
  SELECT year, month, month_val
       , FIRST_VALUE(month_val) OVER (PARTITION BY month ORDER BY month) f_val 
      , LAST_VALUE(month_val) OVER (PARTITION BY month ORDER BY month) l_val 
    FROM your_table
  )
 ORDER BY 1
 /

MONTH    VALUE
----------------
1        100
2        200
3        330

私の個人的な意見では、インラインビューを使用してから参加する方が良いと思いますが、とにかく参加しますが、それでもデバッグしやすい広告です...

于 2013-02-21T14:24:57.253 に答える
0

自己結合を行いたい。一般的な考え方は、同じテーブルから 2 回選択することですが、エイリアスは異なります。

select t1.something, t2.something
from yourtable t1 join yourtable t2 on something
etc
于 2013-02-21T13:00:48.483 に答える
0

select a.month,(a.value-(select b.value from @tablename b where b.year = @year2 and b.month = a.month)) as diff from @tablename a where a.year = @year1

役立つと思います。実際、減算では 2 つの数字しか使用できないことがわかっているため、ここでは年 1 と年 2 を使用しています。テーブル名を適切な場所に配置してください。

于 2013-02-21T13:19:34.527 に答える