0

たとえば、A と B の 2 つの列があるとします。

列 A には 1 ~ 10 の数字が含まれます。列 B には Jan ~ Oct の月が含まれます。

列 B を見て、2 か月前の列 A の値を返すロジックを作成するのに助けが必要です。たとえば、列 B が 3 月の場合、1 月の値を返したいとします。

そうするために、ある種のCASEロジックを使用できると思いますか?

 CASE WHEN ColB = 'March' THEN (Select ColA where ColB = 'January')

上記のロジックが間違っていることはわかっています。これを行う方法を理解しようとしています。何か案は?

ありがとう

更新:この例は非常に単純化しすぎていました...誰もが提案したロジックのいずれかを使用するとエラーが発生します..

列 A に各データ ポイントの複数のケースがあることを追加する価値があります。また、クエリに一意の他の列があるため、DISTINCT を使用できません。

'サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません"

4

4 に答える 4

0

あなたは近かった、このように行うことができます(ただし、これは9つのnull行と1つの有効な行を返します)

SELECT
      CASE WHEN ColB = 'March' 
        THEN (Select ColA FROM tablename WHERE ColB = 'January') 
      END
FROM tablename

または、CASEだろうとせずに行うことができます

SELECT
  (SELECT colA FROM tablename WHERE colB = 'January')
FROM tablename
WHERE colB = 'March'

セカンドランニングの例はこちら

于 2013-06-28T02:04:35.910 に答える
0

結果を確認したい場合は、最初にテーブルを選択する必要があります。これを試してください

select CASE when ColB = 'March' THEN (Select ColA From yourtable where ColB = 'January') END     
from yourtable 
于 2013-06-28T02:05:36.540 に答える
0

セルフJOINが最も役立つと思います:

SELECT a.b Month1 ,b.b Month2
FROM Table1 a
LEFT JOIN Table1 b
 ON a.a = b.a+2

デモ: SQL フィドル

これはすべての月で機能しますが、例に限定できます。

SELECT b.a
FROM Table1 a
LEFT JOIN Table1 b
 ON a.a = b.a+2
WHERE a. = 'March'
于 2013-06-28T02:10:43.423 に答える
0

一般的な解決策が必要なようです。残念ながら、あなたがやっているように月の名前を保存するのはあまり効率的ではありません。しかし、自己結合でそれを行うことができます:

with t as (
      select t.*,
             (case colB
                   when 'January' then 1
                   when 'February' then 2
                   when 'March' then 3
                   when 'April' then 4
                   when 'May' then 5
                   when 'June' then 6
                   when 'July' then 7
                   when 'August' then 8
                   when 'September' then 9
                   when 'October' then 10
                   when 'November' then 11
                   when 'December' then 12
              end) as monthnum
      from t
     )
select colA,
       (select top 1 colA from t t2 where t2.monthnum = t.monthnum - 2) as ColAMinus2
from t
于 2013-06-28T02:27:47.797 に答える