ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

SQLのWHERE句で用いられる相関サブクエリを理解する

はじめに

相関サブクエリもしくはEXISTS述語の使い方として、以下のようなSQLがよく取り上げられます。

SELECT *
  FROM item i
 WHERE EXISTS
  (SELECT *
     FROM stock s
    WHERE i.id = s.id);

これに対して以下のデータが与えられたとします。

◆itemテーブル

id name
1 みかん
2 バナナ
3 リンゴ
4 ぶどう

◆stockテーブル

id quantity
1 10
3 30

この時、EXISTS述語内のサブクエリ"SELECT * FROM stock s WHERE i.id = s.id"だけを見て、以下のように考えてしまうことは無いでしょうか?
※補足:このサブクエリ単体では"i"を定義していないため、エラーとなります。実行するにはFROM句に"item i"の追加が必要です。以下同様です。

EXISTS述語内のサブクエリが2行返す
  ↓
EXISTS述語の評価がTRUEとなる
  ↓
WHERE句の評価がTRUEとなる
  ↓
WHERE句がTRUEのためitemテーブルの全行を返す

ですが、最終的な結果としては2行しか返ってきません。
どこで勘違いが起きてしまったのでしょうか?本エントリではこの疑問について説明します。

理解のポイントはWHERE句の処理にある

先日、WHERE句について解説するエントリをアップしました。
SQLのWHERE句の処理を理解する - ぱと隊長日誌
このエントリでSQLのWHERE句を「集合から条件に合致する行を選択する」処理であり、WHERE句の評価は1行ずつ行われる、と説明しました。
これを理解できればWHERE句の相関サブクエリを理解できます。冒頭の例について、処理の流れに沿いながら確認していきましょう。

(1)
FROM句でitemテーブルが指定されているため、対象となる集合は以下となります。

i.id i.name
1 みかん
2 バナナ
3 リンゴ
4 ぶどう

(2)
WHERE句は1行ずつ処理されるため、まずは先頭の行を評価します。

i.id i.name
1 みかん

(3)
ここでEXISTS述語内のサブクエリを実行します。

SELECT *
  FROM stock s
 WHERE i.id = s.id;

WHERE句が評価しているのは"i.id = 1"ですので、このクエリは以下のように動きます。

SELECT *
  FROM stock s
 WHERE 1 = s.id;

このクエリの結果を示します。

s.id s.quantity
1 10

(4)
サブクエリが1行返したため、EXISTS述語はTRUEとなります。
結果、WHERE句はTRUEとなり、WHERE句の評価していた行が選択されます。

i.id i.name
1 みかん

(5)
以降、対象となる集合の全ての行を処理するまで(3)から繰り返します。
結果として以下の行が選択されます。

i.id i.name
1 みかん
3 リンゴ

WHERE句が常にTRUEとなると勘違いをしてしまった方は、相関サブクエリがitemテーブルとstockテーブルの各集合に対して実行されると考えたのではないでしょうか。
処理を正しく理解するためには、WHERE句はitemテーブルの各行に対して評価されるため、itemテーブルのWHERE句で評価されている行とstockテーブルの集合に対してサブクエリが実行されると理解することが必要です。

単なる(相関でない)サブクエリであればどうなるのか?

このようなSQLであればどうでしょうか?

SELECT *
  FROM item i
 WHERE i.id = (SELECT max(s.id)
                 FROM stock s);

先ほどの例と同様にitemの各行毎にサブクエリが実行されると考えても構いませんが、サブクエリだけが先に実行されると考えても同じ結果となります。なぜなら、外側のクエリで使われているitemテーブルの列をサブクエリで参照していないからです。WHERE句がitemテーブルのどの行を評価していたとしても、サブクエリの結果は変わりません。

サブクエリを先に実行すると以下のSQLとなります。

SELECT *
  FROM item i
 WHERE i.id = 3;

結果は以下の通りです。

i.id i.name
3 リンゴ

まとめ

SQLを理解するためには処理の流れを理解することが大切です。
今回の例でいえば、WHERE句の処理を理解せずに()で囲まれた箇所を先に評価すると理解してしまうと失敗します。

この誤った理解でも以下のSQLは正しく評価できます。

SELECT *
  FROM item i
 WHERE i.id = (SELECT max(s.id)
                 FROM stock s);

でも、別のSQLは正しく評価できません。

SELECT *
  FROM item i
 WHERE EXISTS (SELECT *
                 FROM stock s
                WHERE i.id = s.id);

このエントリがSQLを理解するための一歩となれば幸いです。

参考資料

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

SQLが途中どのように処理されて最終結果に至るかを細かく解説しています。この途中処理こそがSQLを理解するためのカギとなります。
かなりの分量ですので通読は難しくとも、SQLを書いていて気になったことを調べるときに必要な箇所を参照してみてはいかがでしょうか。

達人に学ぶSQL徹底指南書

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

EXISTS述語を述語論理の観点から解説しています。また、相関サブクエリの応用例についても説明されています。

SQLのWHERE句の処理を理解する

はじめに

SQLのWHERE句は「集合から条件に合致する行を選択する」処理です。
ですが、SQLの様々な書き方を学ぶうちにWHERE句の役割について混乱してしまうことがあるかもしれません。本エントリではこの混乱の解消を目標に説明します。

SQLの実行順序

SQLの実行順序は以下の通り決まっています。
FROM→WHERE→GROUP BY→HAVING→SELECT

このうち、本エントリで取り上げるのはSELECT, FROM, WHEREです。
SELECTは集合から列を選択します。
FROMは対象とする集合を指定します。
WHEREは集合から条件に合致する行を選択します。

この後の説明を読み進めるときはこの順番を意識してみてください。

WHERE句の評価は1行ずつ行われる

ここにmember表があります。

name sex_code
あきら 1
ゆみこ 2
けんじ 1

これに対して"sex_code=1"を条件にSQLを発行します。

SELECT name
  FROM member
 WHERE sex_code = 1;

このSQLのWHERE句は対象となる集合のmemberに対して1行ずつ評価を行います。
WHERE句の評価の結果として以下の行が選択されました。

name sex_code
あきら 1
けんじ 1

選択リストに従い、"name"列が選択されます。

name
あきら
けんじ

見出しにも挙げましたが、「WHERE句の評価は1行ずつ行われる」というのがポイントです。
あなたがmember表とSQLを見比べて手作業で処理をするとき、member表が小さいこともあり、全体を俯瞰して一度に処理している感覚になるかもしれません(頭の中では1行ずつ処理しているとしても)。ですが、DBは素直に1行ずつ処理を行います。

これは推測ですが(裏付けとなる資料が見つかりませんでした)、「WHERE句の評価は1行ずつ行われる」ことがWHERE句で集約関数を使えないことにつながっているのかもしれません。
WHERE句に集約関数を使えたとしても、WHERE句の評価は1行ずつのため、集約関数に渡される集合の値は1つのみです。これでは集約関数の意味がありません。

例えば、WHERE句にMAX関数を含んだSQLを書けたとします。

SELECT name
  FROM member
 WHERE sex_code = MAX(sex_code);

WHERE句の評価は1行ずつです。member表の先頭行を評価するとします。

name sex_code
あきら 1

この時、MAX関数にsex_code=1が渡されても、それはSQL実装者の意図と異なるでしょう。
WHERE句に集約関数を使えないのは、このような意味のない記述を避けるためだったのかもしれません。

結合条件を含んだ行選択

先ほどのmember表に加え、sex表を用意します。

sex_code sex_jp
1
2
SELECT m.name,
       s.sex_jp
  FROM member m,
       sex s
 WHERE m.sex_code = s.sex_code
   AND m.sex_code = 1;

このSQLでイメージするのはmember表とsex表をsex_code列の値に応じて結合し、その結果からsex_code=1の行を選択することではないでしょうか?
ですが、これは「集合から条件に合致する行を選択する」を超えて、テーブルの結合処理まで行っています。WHERE句しかないのにJOIN句まで指定されたかのようにふるまうのはなぜでしょうか?

そこでまずは選択リスト、WHERE句を除いて考えてみます。

SELECT *
  FROM member m,
       sex s;

この結果はmember表とsex表のクロス結合(CROSS JOIN)となります。

m.name m.sex_code s.sex_code s.sex_jp
あきら 1 1
ゆみこ 2 1
けんじ 1 1
あきら 1 2
ゆみこ 2 2
けんじ 1 2

ここで改めて選択リスト、WHERE句を戻してみます。

SELECT m.name,
       s.sex_jp
  FROM member m,
       sex s
 WHERE m.sex_code = s.sex_code 
   AND m.sex_code = 1;

このWHERE句は以下の条件に合致する行を選択するものです。
「m.sex_code = s.sex_code」かつ「m.sex_code = 1」
先ほどのクロス結合の表からこの条件に合致する行を選択します。

m.name m.sex_code s.sex_code s.sex_jp
あきら 1 1
けんじ 1 1

選択リストで指定しているのはm.name, s.sex_jp列ですので、以下の結果となります。

m.name s.sex_jp
あきら
けんじ

このように処理を追って考えると、WHERE句は「集合から条件に合致する行を選択する」ことに変わりないとわかります。
実際の内部処理はここで示したようなクロス結合を作ることなく行われますが、結果は同様となります。

結合条件と検索条件を区別する

結合条件を含んだWHERE句がわかりづらいと感じるのであれば、標準SQLに則って"JOIN"で書き直すとわかりやすくなります。

SELECT m.name,
       s.sex_jp
  FROM member m,
       sex s
 WHERE m.sex_code = s.sex_code
   AND m.sex_code = 1;

これは"INNER JOIN"で以下のSQLに書き直せます。

SELECT m.name,
       s.sex_jp
  FROM member m INNER JOIN sex s
    ON m.sex_code = s.sex_code
 WHERE m.sex_code = 1;

ここでもまずは選択リスト、WHERE句を除外して考えてみます。

SELECT *
  FROM member m INNER JOIN sex s
    ON m.sex_code = s.sex_code;
m.name m.sex_code s.sex_code s.sex_jp
あきら 1 1
ゆみこ 2 2
けんじ 1 1

選択リスト、WHERE句を戻してみます。

SELECT m.name,
       s.sex_jp
  FROM member m INNER JOIN sex s
    ON m.sex_code = s.sex_code
 WHERE m.sex_code = 1;

WHERE句の"m.sex_code = 1"に合致する行を選択します。

m.name m.sex_code s.sex_code s.sex_jp
あきら 1 1
けんじ 1 1

選択リストで指定しているのはm.name, s.sex_jp列ですので、以下の結果となります。

m.name s.sex_jp
あきら
けんじ

先ほどのクロス結合にしてから考えた場合と同じ結果となりました。

まとめ

SQLを理解し辛く感じた時は実行順序に立ち返り、まずはFROMでどのような集合を対象にしているか考えるとわかりやすいかもしれません。WHEREはその集合に対して行を選択するものです。
WHERE句に結合条件があればテーブルの結合だ、と形から直截に理解することもよいと思うのですが、様々なSQLの書き方を学ぶうちにその表現力の豊かさから混乱してしまう時があるかもしれません。そんなときは今回のように立ち返って見直していただければと思います。

参考資料

達人に学ぶSQL徹底指南書

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

SQLの実行順序及び"JOIN"での書き換えを参考にさせていただきました。また、SQLのフォーマットも本エントリの参考にしています。
この本はSQLを使い始めて半年から一年程度の経験があることを想定しており、なじみのない記述は難しく感じますので、まずは興味のある個所からつまみ読みするのが楽しいと思います。

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

プログラマのためのSQL 第4版

SQLの教科書といえる本です。著者の序文にある通り、入門書ではなく1年程度の実務経験のある方を対象としています。
ただ、今回のエントリでまとめた基礎レベルの話も解説されています(例えば「24 単純なSELECT文」)。WHERE句とは何か、という一見当たり前のことでも、その概念モデルに立ち戻って確認するのに良い本だと思います。

更新情報

2017/01/28

  • SQLのフォーマットを整えました。
  • 見出しの「単純な行選択」を「WHERE句の評価は1行ずつ行われる」に変更し、内容の見直しを行いました。

住宅ローン2年目以降の住宅ローン控除申告(連帯債務や借換えの場合)

はじめに

昨年の年末調整で住宅ローン2年目の住宅ローン控除申告を行ったのですが、「連帯債務かつ借換え」の記入方法が分からず(どちらか一方であれば記入例があるのですが)、かなり苦労しました。
また、連帯債務の「共有持分」と「連帯債務に係るあなたの負担割合」を混同していたために(この2つは異なるものです)、申告書類を訂正することになりました。
この反省を踏まえ、今後申告される方の参考になればと思い、書類の記入方法をまとめました。

ご注意

内容の一部については税務署(電話相談センター)に確認を行っています。確認した点についてはその旨記載しています。
ですが、執筆者(私)は税務に関して素人であり、本エントリの内容が正確であるという保証はできません。税務署(電話相談センター)への確認についても確認した内容を正確に記載するよう努めましたが、その正確さを保証することはできません。
よって、本エントリは参考にとどめ、最終的には税務署もしくは専門家に確認ください。本エントリの内容によって不利益若しくは損害を負った場合でも補償はできません。
また、記載内容にお気づきの点があれば、コメントなどでご連絡いただければ幸いです。

想定ケース

夫婦の連帯債務で住宅ローンを組み、2年目以降に借換えを行った場合の「給与所得者の(特定増改築等)住宅借入金等特別控除申告書」の記入方法。
説明では連帯債務のみ、借換えのみのケースについても一部触れています。

本エントリでの説明範囲

本エントリでは想定ケースに基づいて躓きやすいポイントのみ説明します。その他の項目については申請書類に添付された記載例や他サイトを参照ください。
例えば、以下の記事では記載方法を非常にわかりやすく解説しています。以降を読み進める前にぜひご一読ください。
2年目の住宅ローン控除の年末調整の必要書類と住宅借入金等特別控除申告書の書き方

書類の準備

「給与所得者の(特定増改築等)住宅借入金等特別控除申告書」兼「年末調整のための(特定増改築等)住宅借入金等特別控除証明書」

住宅ローン2年目に税務署から2~10年目分の申請書類をまとめて送られてきたはずです。今年度分を利用ください。
紛失した場合は税務署に再発行を依頼します。

住宅ローンの年末残高等証明書

金融機関によって該当書類の名前が異なります。例えば、フラット35であれば「融資額残高証明書」となります。

住宅ローン初年度の確定申告書(控え)

住宅借入金等の負担割合の確認に必要です。
紛失した場合は「開示請求」もしくは「閲覧請求」という方法があるそうです。
参考:確定申告書の控えを紛失した時の2つの解決方法 | 知らなきゃ損する確定申告

(※借換えの場合)借換え直前における当初の住宅ローン等の残高の分かる書類

控除対象の住宅ローン残高を計算するために必要となります。不明な場合は金融機関にお問い合わせください。

私の場合、「住宅ローン控除の借換えに伴う計算のため、借換え直前の残高の分かる書類がほしい」と申し出たところ、「支払利息証明書」「支払証明書」を発行されました。

住宅借入金等特別控除申告書の記入方法

①欄「新築又は購入に係る借入金等の年末残高」

赤枠で囲んだ箇所の記入方法です。
f:id:pato_taityo:20170119223505p:plain
※この画像は国税庁の以下の資料から記載例を切り出し、加工しています。
https://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/nencho2016/pdf/100.pdf

以下の3パターンで年末残高の計算を説明します。

  • 連帯債務のみ(借換え無し)
  • 借換えのみ(連帯債務無し)
  • 連帯債務かつ借換え
連帯債務のみ(借換え無し)の年末残高の計算

国税庁の「パンフレット・手引き」に以下の説明があります。

連帯債務による住宅の取得等のための住宅借入金等の年末残高がある場合には、次の算式により、控除を受ける人が負担すべき部分の年末残高を計算します。

「連帯債務による住宅借入金等の年末残高(円)」
   ×
「控除を受ける人が負担すべき割合(%)」
   =
「連帯債務による住宅借入金等の年末残高のうち控除を受ける人が負担すべき部分の年末残高(円)」

「控除を受ける人が負担すべき割合」については、原則として、(特定増改築等)住宅借入金等特別控除の適用を受ける最初の年の確定申告の際に提出した「(特定増改築等)住宅借入金等特別控除額の計算の基礎となる住宅借入金等の年末残高の計算明細書」又は「(特定増改築等)住宅借入金等特別控除額の計算明細書」に記入した負担割合によります。

https://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/nencho2016/pdf/37-51.pdf

例えば、以下の計算となります。
連帯債務による住宅借入金等の年末残高=4,000万円
控除申告者の負担割合=60%
控除申告者の年末残高(①欄)=4,000×60%=2,400万円

ここで注意すべき点は負担割合が共有持分の割合に等しいとは限らないということです。つまり、共有持分が夫婦各々1/2であるからといって、負担割合が1/2となるとは限りません。
ここで用いる負担割合は住宅ローン初年度の確定申告書として提出した「(特定増改築等)住宅借入金等特別控除額の計算の基礎となる住宅借入金等の年末残高の計算明細書」又は「(特定増改築等)住宅借入金等特別控除額の計算明細書」で確認します。

「(特定増改築等)住宅借入金等特別控除額の計算明細書」での負担割合の記載個所(連帯債務に係るあなたの負担割合)を赤枠で示します(この例では連帯債務がないため、100.00%となっています)。申告年度によって書式が一部異なりますが、同様の項目があるはずです。
f:id:pato_taityo:20170119212423p:plain
※この画像は国税庁の以下の資料から記載例を切り出し、加工しています。
https://www.nta.go.jp/tetsuzuki/shinkoku/shotoku/tebiki2014/pdf/10.pdf

借換えのみ(連帯債務無し)の年末残高の計算

国税庁の「タックスアンサー」に以下の説明があります。

借換えによる新たな住宅ローン等が住宅借入金等特別控除の対象となる場合には、次の金額が控除の対象となる住宅ローン等の年末残高となります。

(1)A≧Bの場合
対象額=C
(2)A<Bの場合
対象額=C×A/B
A=借換え直前における当初の住宅ローン等の残高
B=借換えによる新たな住宅ローン等の借入時の金額
C=借換えによる新たな住宅ローン等の年末残高

No.1233 住宅ローン等の借換えをしたとき|所得税|国税庁

(1)のケース
住宅ローン4,000万円・金利2%を4,000万円・金利1%で借換え、年末残高は3,900万円となった。
借換え直前における当初の住宅ローン等の残高(A)=4,000万円
借換えによる新たな住宅ローン等の借入時の金額(B)=4,000万円
借換えによる新たな住宅ローン等の年末残高(C)=3,900万円
A≧Bのため「対象額=C」であり、控除申告者の年末残高(①欄)は3,900万円となります。

(2)のケース
住宅ローン4,000万円・金利2%を4,100万円・金利1%で借換え、年末残高は4,000万円となった。
借換え直前における当初の住宅ローン等の残高(A)=4,000万円
借換えによる新たな住宅ローン等の借入時の金額(B)=4,100万円
借換えによる新たな住宅ローン等の年末残高(C)=4,000万円
A<Bのため「対象額=C×A/B」であり、控除申告者の年末残高(①欄)は3,902万4,391円となります。

(2)の計算結果の円未満の端数は切り上げました。端数処理は切り上げでも切り捨てでもよいとのことです(税務署確認済み)。

「借換え直前における当初の住宅ローン等の残高」が不明な場合は金融機関に問い合わせてください。私が入手した「支払証明書」の場合、以下の表が記載されていました(日付及び数字はダミーです)。

返済年月日 元金 利息 合計
2016/05/05
80,000
30,000
110,000
2016/05/31
40,000,000
20,000
40,020,000
40,080,000
50,000
40,130,000

この例では借換えに伴う返済を2016/05/31に行っており、「借換え直前における当初の住宅ローン等の残高」は40,000,000円となります。借換えに伴う返済のうち、残高に含まれるのは元金のみで利息は含まないことにご注意ください(税務署確認済み)。

円未満の端数については切り上げを薦めている方がいました。

借換えによる新たな住宅ローン等の借入額が、当初の住宅ローン等の残高を超える場合には、上記のような計算をしますが、計算途中で端数が発生します。
その端数は、どのように計算すればいいのでしょうか。
端数処理については、規定がないようです。
そんなときは、納税者有利にするのが基本です。
住宅ローン控除額の計算では、年末残高が多くなれば控除額が多くなりますので、円未満の端数を切り上げてください。
ただ、住宅ローン控除額は、100円未満切捨てになりますから、年末残高の端数を同処理しても計算結果は、まず同じになるでしょう。

住宅ローン控除|住宅ローンの借り換えをした場合の条件、計算方法 | 税金、社会保険の知恵袋

また、国税庁の確定申告書等作成コーナーで作成した確定申告書の「(付表2)連帯債務がある場合の住宅借入金等の年末残高の計算明細書」にある「連帯債務による借入金に係る各共有者の年末残高」でも円未満端数を切り上げて計算されていました。
よって、円未満の端数は切り上げて処理したほうがよいでしょう。

(2)のケース(借換え後の金額が借換え前の残高を上回る)は当初の住宅ローンの残高+借換えの手数料で借換えた場合に起こりえます。この全額を住宅ローン控除として認めてしまうと、借換え手数料に対しても住宅ローン控除を認めてしまうことになるため、このような計算を行っているそうです。
参考:借換えしても住宅ローン控除はできる?年末調整の手続きに注意!

今回行った計算は借換えを行った年だけでなく、翌年以降の住宅ローン控除申請でも同様の計算が必要です(税務署確認済み)。

連帯債務かつ借換えを行った場合の年末残高の計算

※本項について税務署に確認済み

連帯債務のみと借換えのみの各計算の合わせ技となります。前項の説明も参照ください。
まず借換えでの計算を行い、これに対して負担割合を掛けます。

借換え時点の当初の住宅ローンの残高(A)=4,000万円
借換え時点の新たな住宅ローンの残高(B)=4,100万円
年末時点の新たな住宅ローンの残高(C)=4,000万円
控除申告者の負担割合=60%

A<Bのため「対象額=C×A/B×60%」であり、控除申告者の年末残高(①欄)は2,341万4,635円となります。

借換えのみのケースに記載の通り、今回行った計算は借換えを行った年だけでなく、翌年以降の住宅ローン控除申請でも同様の計算が必要です

借換え後の「連帯債務による住宅借入金等の年末残高」

※本項について税務署に確認済み

赤枠で囲んだ箇所の記入方法です。
f:id:pato_taityo:20170119223837p:plain
※この画像は国税庁の以下の資料から記載例を切り出し、加工しています。
https://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/nencho2016/pdf/100.pdf

住宅ローンの借換えを行った場合、備考欄右上の「連帯債務による住宅借入金等の年末残高」は先に説明した借換えのみの年末残高と同じ計算を行います。ここでは負担割合を掛けません。
説明(引用)を以下に再掲します。

借換えによる新たな住宅ローン等が住宅借入金等特別控除の対象となる場合には、次の金額が控除の対象となる住宅ローン等の年末残高となります。

(1)A≧Bの場合
対象額=C
(2)A<Bの場合
対象額=C×A/B
A=借換え直前における当初の住宅ローン等の残高
B=借換えによる新たな住宅ローン等の借入時の金額
C=借換えによる新たな住宅ローン等の年末残高

No.1233 住宅ローン等の借換えをしたとき|所得税|国税庁

住宅ローン4,000万円・金利2%を4,100万円・金利1%で借換え、年末残高は4,000万円となった。
借換え直前における当初の住宅ローン等の残高(A)=4,000万円
借換えによる新たな住宅ローン等の借入時の金額(B)=4,100万円
借換えによる新たな住宅ローン等の年末残高(C)=4,000万円
A<Bのため「対象額=C×A/B」であり、「連帯債務による住宅借入金等の年末残高」は3,902万4,391円となります。

記載例として「連帯債務による住宅借入金等の年末残高」に住宅ローンの年末残高等証明書の金額を記載すると説明していることがありますが、借換えの場合は上記の通り異なるため注意が必要です。

備考欄

※本項について税務署に確認済み

赤枠で囲んだ箇所の記入方法です。
f:id:pato_taityo:20170119224029p:plain
※この画像は国税庁の以下の資料から記載例を切り出し、加工しています。
https://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/nencho2016/pdf/100.pdf

連帯債務者がいる場合、以下に従って記入が必要です。

 「備考」欄に、他の連帯債務者から、「私は連帯債務者として、右上の住宅借入金等の残高○○○円のうち、○○○円を負担することとしています。」等の文言、住所及び氏名の記入と押印を受けてください。その方が給与所得者である場合には、その勤務先の所在地及び名称も併せて記入を受けてください。
 なお、「備考」欄に書ききれない場合は、適宜別紙に記載して添付してください。

https://www.nta.go.jp/shiraberu/ippanjoho/pamph/gensen/nencho2016/pdf/100.pdf

連帯債務者の負担額は以下の計算を行います。
「連帯債務による住宅借入金等の年末残高(円)」
   ×
「連帯債務者が負担すべき割合(%)」
   =
「連帯債務による住宅借入金等の年末残高のうち連帯債務者が負担すべき部分の年末残高(円)」

「連帯債務による住宅借入金等の年末残高(円)」は備考欄右上に記載したものです。借換え時の記入例は先の説明を参照ください。

「連帯債務者が負担すべき割合(%)」は住宅ローン初年度の確定申告書として提出した「(特定増改築等)住宅借入金等特別控除額の計算の基礎となる住宅借入金等の年末残高の計算明細書」又は「(特定増改築等)住宅借入金等特別控除額の計算明細書」で確認します。

例えば、以下の計算となります。
連帯債務による住宅借入金等の年末残高=3,900万円
連帯債務者の負担割合=40%
連帯債務者の負担すべき年末残高=3,900×40%=1,560万円

会社への書類提出と説明

借換えや負担割合による計算を行った場合、会社の担当者から計算の根拠を確認されることがあります。提出書類からは借換え前の金額や負担割合を確認できないためです。
書類の提出と併せて、記入の際に用いた数値(金額)と計算過程を伝えることで、事務処理がスムーズに進むかもしれません。

更新情報

2017/11/11

「借換え直前における当初の住宅ローン等の残高」の確認方法について追記しました。