前回の同じ内容のフィールド列に別々の結果を表示したいの続きになります。
https://zawazawa.jp/ms-access/topic/131
前回は列の左側と右側で勘定科目コード別に分けたいというものでした。
これに付属して、金額(費用)及び金額(収益)の数値が0ならば非表示になるようにしたい。
・0で非表示になったら、データが上から押し上げていく形で表示されるようにしたい
・0があると非表示になるが、行全体が非表示になるのではなく、例えば左側の部分の数値が0になったら左側のみ非表示にしたい。
例:
更新前
xpr1000:Expr1001:金額(費用):勘定科目コード:勘定科目:金額(収益)
4001:仕入:25000:5001:売上:3500
4002:売上原価:0:5002:商品売買益:0
4003:発送費:0:5003:受取手数料:0
4004:減価償却費:500000:5004:受取家賃:0
4005:広告宣伝費:120000:5005:受取利息:0
4006:通信費:7000:5006:受取配当金:0
4007:水道光熱費:10000:5007:雑益:0
4008:租税公課:0:5008:有価証券利息:1300
4009:給料:0:5009:有価証券売却益:0
4010:旅費交通費:-14000:5010:固定資産売却益:12000
4011:支払保険料 0:5011:償却債権取立益:0
4012:消耗品費:4000
4013:雑損:0
4014:貸倒引当金繰入:0
4015:貸倒損失:0
4016:支払利息:0
4017:手形売却損:0
4018:有価証券売却損:0
4019:固定資産売却損:0
更新後、
xpr1000:Expr1001:金額(費用):勘定科目コード:勘定科目:金額(収益)
4001:仕入:25000:5001:売上:3500
4004:減価償却費:500000:5008:有価証券利息:1300
4005:広告宣伝費:120000:5010:固定資産売却益:12000
4006:通信費:7000
4007:水道光熱費:10000
4010:旅費交通費:-14000
4012:消耗品費:4000
お手数ですが宜しくお願い致します。
前回の回答、2020/01/25 (土) 09:05:50 に記述した SQL へ
金額が 0 ではない科目が表示対象になるよう 抽出条件を加えれば
ご希望の結果になるでしょう。
mayu様
前回に引き続きありあとうございます。
前回はmayu様の教えて頂いた集約関数のやり方で解決させて頂きましたので、
こちらの方はをあまり見ずに申し訳なく思っています。
上記について教えて頂きたく。
q=テーブルorクエリ名
x.yは何のテーブルorクエリに該当するのでしょうか?(自己結合というもの?)
それにちなんでfrom句の損益計算書 x,損益計算書 yは損益計算書 As x,損益計算書 As yを単純に省略してるだけ?
もしくは最初のx yと関係してる?
お手数ですが宜しくお願い致します。
x と y は両方ともに 損益計算書 のことですが
既にご理解いただいてるように、自己結合 を駆使した場合は
同じ名前のオブジェクトを複数使用することになりますから
各々を区別するため、ユニークな名前を付与する必要があります。
はい。その通りです。
Microsoft Access では、エイリアスの利用において
FROM句の As は省略可能で SELECT句 の As は省略不可
という仕様になっています。
テーブル名でもクエリ名でもないのですが、意味合いとしてはクエリになります。
この部分で、一つの完結したクエリ( SQL文 )になり
Accessにおいても、名前を付けて保存する ことが可能です。
もちろん、保存せずに使用することも可能で
その場合は、インラインビューやサブクエリという言い方をします。
今回の場合だと、インラインビューになっていて
q というのは、インラインビューに付けた名前です。
このビューの役割は
4000番台 のコード と 5000番台 のコードそれぞれにグループ連番を付与することですが
累計計算も同時に出来たりしますから
以下にデモンストレーションを掲載しておきます。
( 続き )
■ 損益計算書
■ SQL
■ 結果
回答ありがとうございます。
教えて頂いた通りにできました。
また、教えて頂いて恐縮ですが下記の様にするにはどうすればいよいか教えて頂きたく。
・1000番代と9002,9004,9005番代が左側、2000番代と3000番代が右側になるようにする。
この結果を出すためのSQLコマンドがうまくいきません
↓書いたSQLコマンド
※テーブル名、損益計算書→貸借対照表
SELECT Max(IIf([貸借対照表].[勘定科目コード]<2000 Or [貸借対照表].[勘定科目コード]>9000,[貸借対照表].[勘定科目コード])) AS 勘定科目コード
, Max(IIf([貸借対照表].[勘定科目コード]<2000 Or [貸借対照表].[勘定科目コード]>9000,[貸借対照表].[勘定科目])) AS 勘定科目
, Max(IIf([貸借対照表].[勘定科目コード]<2000 Or [貸借対照表].[勘定科目コード]>9000,[貸借対照表].cost)) AS 金額_資産
, Max(IIf([貸借対照表].[勘定科目コード] Between 2000 And 3001,[貸借対照表].[勘定科目コード])) AS 勘定科目コード2
, Max(IIf([貸借対照表].[勘定科目コード] Between 2000 And 3001,[貸借対照表].[勘定科目])) AS 勘定科目2
, Max(IIf([貸借対照表].[勘定科目コード] Between 2000 And 3001,[貸借対照表].revenue)) AS 金額_負債, 貸借対照表.gnum
FROM (SELECT x.勘定科目コード
, x.勘定科目, x.[金額(資産)] AS cost
, x.[金額(負債)] AS revenue
, Count(1) AS gnum
FROM 貸借対照表 AS x
, 貸借対照表 AS y
WHERE x.勘定科目コード Between 1001 And 3001 Or x.勘定科目コード=9002 Or x.勘定科目コード=9004 Or x.勘定科目コード=9005
AND y.勘定科目コード Between 1001 And 3001 Or y.勘定科目コード=9002 Or y.勘定科目コード=9004 Or y.勘定科目コード=9005
AND x.勘定科目コード \ 1000 = y.勘定科目コード \ 1000
AND x.勘定科目コード >= y.勘定科目コード
AND Abs( x.[金額(資産)] ) > 0
AND Abs( y.[金額(資産)] ) > 0
GROUP BY x.勘定科目コード
, x.勘定科目
, x.[金額(資産)]
, x.[金額(負債)]) AS 貸借対照表
GROUP BY 貸借対照表.gnum
ORDER BY 貸借対照表.gnum;
返した結果が下記になります
勘定科目コード 勘定科目 金額_資産 勘定科目コード2 勘定科目2 金額_負債 gnum
9005 減価償却累計額 0 37
9004 立替金 70000 3001 預り金 50000 73
gnumの列を見ると並びがきれいに並ばなくなります。
何卒教えて頂きたくお願い致します。
左側に表示するコードと、右側に表示するコードに 規則性や共通点が無いですから
という区分けが、意味をなさなくなったのが原因です。
とはいえ、
SQL文の記述が、読みにくくて 見通しが悪い場合は
条件の分岐や、マジックナンバーの追記 といった手法を採用すると
記述がますます汚くなりますから
設計を見直したり工夫するのが、定番の解決方法になります。
■ 貸借対照表
`
sqlrid AUTOINCREMENT PRIMARY KEY
, 種別 INT NOT NULL
, コードfrom INT NOT NULL
, コードto INT NOT NULL
);
( 続き )
次に、勘定科目コード、種別、金額 の抽出条件全てを満たす
レコードを表示するためのクエリを作ります。
( SQLの結果に Q_表示対象 という名前を付けて保存します )
■ 仕上げのSQL
■ 結果
( おまけ )
>> 5reito117さんの SQL を添削した正解例は、以下になります。
( 前回申し上げたとおり、煩雑で汚い SQL 文になりますから、この記述はお勧めしません )
mayu様
いつも回答を頂き誠にありがとうございます。
時間遅くなりましたが無事できました。
でも不思議に思ったのは、今回(おまけではない方)は新しく『T_条件』というテーブルを追加してクエリを作成しました。
クエリは結合してテーブル同士をつなぎ合わせるのが通常ですが、これは『T_条件』と『貸借対照表』のテーブルが独立した状態で、結合のような事が出来て条件通りのデータが返されているという事です。
where条件を除けば特に大きな変わりはないはずなのに、何故このような独立したテーブルの状態で、望んだ結果が返されるのでしょうか?
SQL における テーブル同士の結合は
イコールだけではなく、
<= や >= や <> など、他の比較演算子も使えます。
ただ、Access のデザインビューでは
こういった演算子を用いて結合するクエリ を作成することは出来ず、
デザインにおいても、グラフィカルな表示はできません。
SQL の扱いにおいて、デザインビューの機能や能力は かなり限定されたものになります。
また、オブジェクト間における 結合の種類において
内部結合は FROM 句だけではなく、WHERE 句に記述することが可能で
( 外部結合は、FROM 句で JOIN による結合が必須 )
私が記述した SQL は、デザインビューで表示できるよう、
WHERE句 に記述する方法を採用しています。
したがって、>> 7における Q_表示対象 の SQL は、
以下のような記述を用いても、同様の結果を得ることが可能です。
mayu様
いつも回答頂きありがとうございます。
まさか、where句でも結合が出来るなんて知りませんでした。
SQLは覚える事がいっぱいありますけね。
自分もmayu様のように自分で問題解決できるようになりたいです。
改めてありがとうございました。