質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.34%

連番を付与する際、条件によって奇数連番、偶数連番に分けたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,281

score 37

前提・実現したいこと

経理の仕訳関連のシステムを作っています。
DBから引っ張ってきた仕訳データを出力する際、
同一請求先で、0か1のみを持つコードがあるとき、
0を持っていた場合は偶数、1を持っていた場合は奇数で連番付与ができるようにしたいです。

今までは下記のような形で連番を付与していました。

例)
SELECT
ROW_NUMBER() ORVER(PARTITION BY ID,RceuptId ORDER BY ID) AS NUM
, *
FROM TBL_MatchingReceipt

1,2,3,4,5...と連番が付与されるのですが、
そうではなく、
例えば奇数連番なら
1,3,5,7,9...
偶数連番なら
2,4,6,8,10...
のような連番にしたいです。

よろしくお願いします。

試したこと

SELECT
CASE WHEN
ReceiptId = 0 THEN ROW_NUMBER() ORVER(PARTITION BY ID,RceiptId ORDER BY ID) + 1
ELSE ROW_NUMBER() ORVER(PARTITION BY ID,RceiptId ORDER BY ID) + 2
END AS NUMBER
FROM TBL_MatchingReceipt

補足情報(FW/ツールのバージョンなど)

SQL Servwe 2014

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+4

求めた連番を以下の様に加工すれば、希望のものになりそうですが。
偶数連番:連番*2
奇数連番:連番*2-1

追記

select t.*
   , (BASE_NUMBER -1 + case when ReceiptId = 1 then 0 else 1 end )as number
from (
  SELECT *, ROW_NUMBER() ORVER(PARTITION BY ID,RceiptId ORDER BY ID,RceiptId) * 2 AS BASE_NUMBER
  FROM TBL_MatchingReceipt
) t


ネストさせなくても良いかも

SELECT *
     , ROW_NUMBER() ORVER(PARTITION BY ID,RceiptId ORDER BY ID,RceiptId) * 2 
     + case when ReceiptId = 1 then 0 else 1 end -1
     AS BASE_NUMBER
FROM TBL_MatchingReceipt

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/26 15:21 編集

    欠番無しで別々にという事でしたか。
    修正しておきます。

    キャンセル

  • 2019/08/26 16:37

    お手数おかけして申し訳ありませんでした!
    ご親切に追記等していただけてとてもうれしく思います。
    教えて頂いた方法を活かせるように頑張ります。
    今回はご回答いただきありがとうございました。

    キャンセル

  • 2019/08/26 16:47

    よく考えると、ReceiptId もPARTITION byに含めればReceiptId 毎の連番になるので、最初の内容に戻しました。

    キャンセル

checkベストアンサー

+1

ReceiptIdが0のものと1のものと別に取得してからunionで結合したらどうですか?
連番は、0のほうは連番×2、1のほうは連番×2-1で。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/26 15:17

    できました!
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る