0

これは、私の戻りデータがどのように構造化されているかの簡単な例です:

id | cat id | value | reverse
1  | 1      | 5     | false
2  | 1      | 5     | false
3  | 2      | 2     | true
4  | 2      | 1     | false
5  | 1      | 3     | true

以下の sql ステートメントでは、列ごとに各value型グループの数を取得しようとしてvalueいます。列が trueの場合reverse、スケールを逆にする必要があります。したがって、スケールは次のようになります。

5 = 1
4 = 2
3 = 3
2 = 4
1 = 5

次の SQL ステートメントを試しましたが、カウントに逆のスケールを適用していないようです。逆のフラグをすべて無視しているだけです。

select value, count(
case reverse
    WHEN false THEN 
        CASE value
        WHEN '5' THEN '1'
        WHEN '4' THEN '2'
        WHEN '3' THEN '3'
        WHEN '2' THEN '4'
        WHEN '1' THEN '5'

    END
    ELSE value
END
)
from table1
group by value

私が間違っていることは何ですか?逆のロジックを適用して、逆の質問の値を正しい値にカウントするにはどうすればよいですか?

4

2 に答える 2

1

だから私は誤解しているかもしれません。もしそうなら、私はお詫び申し上げます。しかし、私の理解では、絶対値でカウントを取得したいということです....したがって、値が1の5行と値が5の5行(反転)がある場合、私はしたいでしょう1 の値に対して 10 のカウントを表示します。

それが事実であり、int の代わりに文字列があると仮定します (ただし、値はすべて整数であり、より複雑なものではありません:

    ;WITH reversed AS 
    (
        SELECT id, 
            [cat id], 
            CASE WHEN [reverse] = 1 THEN 6 - CAST([value] AS INT) 
                ELSE CAST([value] AS INT) END AS [calcValue]
        FROM table1
    )
    SELECT calcValue, COUNT(id) AS counts
    FROM reversed
    GROUP BY calcValue;

元の計算の問題の一部は、元の値をグループ化する前に何もしていないことです。case ステートメントのカウントを取得しているだけです。値が ではない限り、そのCOUNT()中の値が異なっていても は変わりませんNULL

于 2013-03-12T20:22:09.800 に答える
0

これを試して:

with data as ( 
  select * from ( values
    (1,1,5,'false'),
    (2,1,5,'false'),
    (3,2,2,'true'),
    (4,2,1,'false'),
    (5,1,3,'true')
    ) data(id,cat,value,reverse)
) 
select 
  id,
  cat,
  value = case when reverse='false' then value else 6-value end
from data

これを返す:

id          cat         value
----------- ----------- -----------
1           1           5
2           1           5
3           2           4
4           2           1
5           1           3
于 2013-03-12T20:07:39.043 に答える