Microsoft Access 掲示板

1行だけのクエリデータを縦並びにしたい

14 コメント
views

毎回大変お世話になってます。
1行だけのクエリデータを縦並びにしたいのですが、それは可能でしょうか?
現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)
  10     15     100 ・・・
それを下記の様にしたいのです(順番は元データになく指定順に並べ替えしたい為のもの)
[項目] [金額] [順番]
 A   10   1
 B   15   2
 C  100   3

いいアイデアあれば宜しくお願いします。
  

beginner
作成: 2025/08/01 (金) 14:49:50
通報 ...
1

1行だけのクエリデータを縦並びにしたいのですが、それは可能でしょうか?
現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)

2通りの方法を載せておきます

 
■ 1 ~ 16 までの数値を入力した補助テーブルを使う方法
 
・DDL

CREATE TABLE t_num ( num INT PRIMARY KEY ) ;

 
・テーブルデータ

num
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

 
・DML ( 文中の クエリ名 及び 項目XXX金額 は実際の名前に変更して下さい )

SELECT ChrW( 64 + x.num ) As 項目
     , Choose( 
           x.num
         , y.項目A金額
         , y.項目B金額
         , y.項目C金額
         , y.項目D金額
         , y.項目E金額
         , y.項目F金額
         , y.項目G金額
         , y.項目H金額
         , y.項目I金額
         , y.項目J金額
         , y.項目K金額
         , y.項目L金額
         , y.項目M金額
         , y.項目N金額
         , y.項目O金額
         , y.項目P金額
      ) As 金額
    , x.num As 順番
FROM t_num   x
   , クエリ名 y
ORDER BY 3
;

 
■ ユニオンクエリを使う方法

SELECT 'A' As 項目, 項目A金額 As 金額, 1 As 順番 FROM クエリ名
UNION ALL
SELECT 'B', 項目B金額, 2 FROM クエリ名
UNION ALL
SELECT 'C', 項目C金額, 3 FROM クエリ名
UNION ALL
SELECT 'D', 項目D金額, 4 FROM クエリ名
UNION ALL
SELECT 'E', 項目E金額, 5 FROM クエリ名
UNION ALL
SELECT 'F', 項目F金額, 6 FROM クエリ名
UNION ALL
SELECT 'G', 項目G金額, 7 FROM クエリ名
UNION ALL
SELECT 'H', 項目H金額, 8 FROM クエリ名
UNION ALL
SELECT 'I', 項目I金額, 9 FROM クエリ名
UNION ALL
SELECT 'J', 項目J金額, 10 FROM クエリ名
UNION ALL
SELECT 'K', 項目K金額, 11 FROM クエリ名
UNION ALL
SELECT 'L', 項目L金額, 12 FROM クエリ名
UNION ALL
SELECT 'M', 項目M金額, 13 FROM クエリ名
UNION ALL
SELECT 'N', 項目N金額, 14 FROM クエリ名
UNION ALL
SELECT 'O', 項目O金額, 15 FROM クエリ名
UNION ALL
SELECT 'P', 項目P金額, 16 FROM クエリ名
ORDER BY 3
;
2
beginner 2025/08/04 (月) 08:30:37 61dd6@2128d

mayuさん ありがとうございます。
ユニオンクエリで試しまた。それでいけたのですが全項目だと”メモリ不足”や”これ以上テーブルは無理”のメッセージが出ます。5ヶ位づつのユニオンだといけます。ベースの各項目が計算でして出したものだからでしょうか? 

3

現行データは
[項目A金額] [項目B金額] [項目C金額]・・・の1行だけのデータです(16項目)
  10     15     100 ・・・

このデータはAccessで作成したものでしょうか。
それとも外部から取り込んだものでしょうか。

どちらにしてもリレーショナルデータベースとしてはNGなテーブル設計です。

Accessで作成したものならテーブル設計を欲しい結果の形(正規形)になるようにし直しましょう。
外部から取り込んだものなら取り込むときに正規形のテーブルに変換して取り込むようにしましょう。

取り込むときに変換する方法はいろいろありますが、mayuさんの回答のクエリで正規形に変換して追加クエリで追加するのもひとつの方法です。

4

全項目だと”メモリ不足”や”これ以上テーブルは無理”のメッセージが出ます。

クエリの列数は 16 ということでしたが、実際は 16 列以上だったりしないでしょうか

あまりに縦結合する回数が多かったり、
演算フィールドの値に定義域集計関数を使っていたりすると、リソース不足になることも十分ありえます

また、>> 1の回答で補助テーブルを使う方法も紹介していますが、こちらの結果はどうだったのでしょうか
ユニオンクエリより軽い( クエリのデータスキャンが一回で済みます )ので
メモリ不足のエラーが発生するとは考えにくいです
 

ベースの各項目が計算でして出したものだからでしょうか?

16の演算フィールドは 全て同じ計算方法 で算出していますか

浮動小数点が含まれる列・含まない列があったり、列毎に使用する関数が異なっているなど
データ型が混在 してたりはしないでしょうか
混在する場合は、結合の際に CCur関数などで演算フィールドのデータ型を統一する必要があるでしょう
 

5ヶ位づつのユニオンだといけます

UNION ALL句を5回内包した単体のユニオンクエリを 3 ~ 4つ作り
単体のユニオンクエリ同士を、再度 UNION ALL で結合したということでしょうか

もし、そうであるなら 単体のクエリで利用するリソースが多すぎるということです
先に述べたように、補助テーブルを使う方法が妥当でしょう

5
beginner 2025/08/04 (月) 10:25:03 61dd6@2128d

hetenaさん ありがとうございます。
現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)

SELECT Sum(IIf([損益分類ID]=4,[損益分類合計],0)) AS 期首在庫, Sum(IIf([損益分類ID]=3,[損益分類合計],0)) AS 仕入高, [期首在庫]+[仕入高] AS 当期仕入, Sum(IIf([損益分類ID]=5,[損益分類合計],0)) AS 期末在庫, [当期仕入]-[期末在庫] AS 売上原価, Sum(IIf([損益分類ID]=1,[損益分類合計],0)) AS 製品売上高, Sum(IIf([損益分類ID]=2,[損益分類合計],0)) AS 家賃収入, [製品売上高]+[家賃収入] AS 収入計, [収入計]-[売上原価] AS 売上総利益, Sum(IIf([損益分類ID]=6,[損益分類合計],0)) AS 販管費, [売上総利益]-[販管費] AS 営業利益, Sum(IIf([損益分類ID] In (7,8,9),[損益分類合計],0)) AS 営業外収益, Sum(IIf([損益分類ID] In (10,11,12,13,14,15),[損益分類合計],0)) AS 営業外費用, [営業利益]+[営業外収益]-[営業外費用] AS 経常利益, Sum(IIf([損益分類ID]=16,[損益分類合計],0)) AS 特別損失, [経常利益]-[特別損失] AS 税引前当期純利益, Sum(IIf([損益分類ID]=12,[損益分類合計],0)) AS 法人税等, [税引前当期純利益]-[法人税等] AS 当期純利益
FROM Q試算表用Base09_損益分類Gr集計;

FROMのクエリは集計クエリで分類毎の合計金額を出してます。その各合計金額を上記で更に色々計算させています(それで1行のデータになってます)。それを後々扱い易い様に縦並びにしたいのです。
この1行のデータの形がよくないでしょうか?

10

現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)

このクエリデータを変形しようとしているのですね。
このクエリのソース自体も名称からして集計クエリのようですね。
集計クエリをもとにクエリを作成するという設計は重い処理になりがちです。
メモリ消費も多くなりそうです。

また、このクエリは縦並びのもの(正規化された形)を横並びになるように変形するものですね。

で、質問でやろうとしていることは、この横並びのものを再び縦並びに戻すということですね。
縦のものを横にして、再び縦に戻すという無駄なことをしているように思えます。

大元のテーブルが正規化されたものなら、そこから直接希望の結果データを得るクエリを考えた方が軽い処理になりそうです。

6
beginner 2025/08/04 (月) 11:47:16 61dd6@2128d

mayuさん ありがとうございます。
もう一つの方法で下記SQL実行させると クエリ式エラー , Choose( *** ’の構文エラー:演算子がありませんとなります。何か間違えてます?

 SELECT ChrW(64 + x.num) As 項目
     , Choose( 
           x.num
         , y.期首在庫
         , y.仕入高
         , y.当期仕入
         , y.期末在庫
         , y.売上原価
         , y.製品売上高
         , y.家賃収入
     , y.収入計
         , y.売上総利益
         , y.販管費
         , y.営業利益
         , y.営業外収益
         , y.営業外費用
         , y.経常利益
         , y.特別損失
         , y.税引前当期純利益
         , y.法人税等
     , y.当期純利益
      ) As 金額
    , x.num As 順番
FROM t_num x
   , Q試算表用Base10_損益各利益 y
ORDER BY 3
;
7
mayu 2025/08/04 (月) 11:59:44 修正 fc5d2@6c788 >> 6

クエリ式エラー , Choose( *** ’の構文エラー:演算子がありませんとなります。何か間違えてます?

現行データはACCESS作成分で下記SQLとなってます。(最終的に18項目となりました)

Q試算表用Base10_損益各利益 クエリには 18列 あるわけですから
t_num のテーブルデータは、1~ 16 ではなく、1 ~ 18 になっていますか

また、>> 6のSQL文中に全角空白が含まれていますから、全て半角に修正して下さい
SQL文の句間を区切る空白に全角は使えません

それと

Sum(IIf([損益分類ID] In (10,11,12,13,14,15),[損益分類合計],0)) AS 営業外費用
Sum(IIf([損益分類ID]=12,[損益分類合計],0)) AS 法人税等

損益分類ID 12 は勘定科目が重複していますから、当期純利益の値が正確ではないように思えます

8
beginner 2025/08/04 (月) 14:32:31 61dd6@2128d

mayuさん ありがとうございます。
やはり全角スペースが入ってた様です。それを注意深く修正したら出来ました。
金額算出の指摘もありがとうございました(確かに間違ってました)。
この素晴らしいSQLは半分も理解できてないのですが(すみません)、コードのままだと項目がA、B・・・になってます(多分ChrWの兼ね合いですね)。それを元データのフィールド名の”期首在庫” ”仕入高” 等にするにはどうすればいいでしょうか? それと各金額を通貨型にするにはどうしたらいいでしょうか?(現在は文字列型になっているので)

9

コードのままだと項目がA、B・・・になってます(多分ChrWの兼ね合いですね)。
それを元データのフィールド名の”期首在庫” ”仕入高” 等にするにはどうすればいいでしょうか?

方法としては大きく2つあります

【 1 】

t_num テーブルに従属列を作り、2列構成にします

CREATE TABLE t_num ( 
      num  INT PRIMARY KEY
    , 科目 VARCHAR(100)
);

 

num科目
1期首在庫
2仕入高
3当期仕入
4期末在庫
5売上原価
6製品売上高
7賃収入
8収入計
9売上総利益
10販管費
11営業利益
12営業外収益
13営業外費用
14経常利益
15特別損失
16税引前当期純利益
17法人税等
18当期純利益

 
SQL文では ChrW関数の使用箇所を

- SELECT ChrW(64 + x.num) As 項目

+ SELECT x.科目 As 項目

とテーブルの従属列への参照に置き換えるのが王道と言えるでしょう

個々のデータをテーブルというオブジェクトを使って「可視化」できるメリットが大きいため
私としては、こちらの方法をお薦めします

【 2 】

t_num テーブルは1列構成のままにしておき、SQL文中に文字リテラルを直に埋め込んでもいいでしょう
( お薦めはしませんが )

- SELECT ChrW(64 + x.num) As 項目

+ SELECT Choose(
+              x.num
+           , '期首在庫'
+           , '仕入高'
+           , '当期仕入'
+           , '売上原価'
+           , '製品売上高'
+           , '賃収入'
+           , '収入計'
+           , '売上総利益'
+           , '賃収入'
+           , '収入計'
+           , '売上総利益'
+           , '販管費'
+           , '営業利益'
+           , '営業外収益'
+           , '営業外費用'
+           , '経常利益'
+           , '特別損失'
+           , '税引前当期純利益'
+           , '法人税等'
+           , '当期純利益'
+        ) As 項目

 

それと各金額を通貨型にするにはどうしたらいいでしょうか?(現在は文字列型になっているので)

 
【 1 】の方法で実装したSQL

SELECT x.科目 As 項目
     , Choose( 
           x.num
         , CCur( y.期首在庫 )
         , CCur( y.仕入高 )
         , CCur( y.当期仕入 )
         , CCur( y.期末在庫 )
         , CCur( y.売上原価 )
         , CCur( y.製品売上高 )
         , CCur( y.家賃収入 )
         , CCur( y.収入計 )
         , CCur( y.売上総利益 )
         , CCur( y.販管費 )
         , CCur( y.営業利益 )
         , CCur( y.営業外収益 )
         , CCur( y.営業外費用 )
         , CCur( y.経常利益 )
         , CCur( y.特別損失 )
         , CCur( y.税引前当期純利益 )
         , CCur( y.法人税等 )
         , CCur( y.当期純利益 )
       ) As 金額
     , x.num As 順番
FROM t_num x
   , Q試算表用Base10_損益各利益 y
ORDER BY 3
;

 
【 2 】の方法で実装したSQL

SELECT Choose(
             x.num
          , '期首在庫'
          , '仕入高'
          , '当期仕入'
          , '売上原価'
          , '製品売上高'
          , '賃収入'
          , '収入計'
          , '売上総利益'
          , '賃収入'
          , '収入計'
          , '売上総利益'
          , '販管費'
          , '営業利益'
          , '営業外収益'
          , '営業外費用'
          , '経常利益'
          , '特別損失'
          , '税引前当期純利益'
          , '法人税等'
          , '当期純利益'
       ) As 項目
     , Choose( 
           x.num
         , CCur( y.期首在庫 )
         , CCur( y.仕入高 )
         , CCur( y.当期仕入 )
         , CCur( y.期末在庫 )
         , CCur( y.売上原価 )
         , CCur( y.製品売上高 )
         , CCur( y.家賃収入 )
         , CCur( y.収入計 )
         , CCur( y.売上総利益 )
         , CCur( y.販管費 )
         , CCur( y.営業利益 )
         , CCur( y.営業外収益 )
         , CCur( y.営業外費用 )
         , CCur( y.経常利益 )
         , CCur( y.特別損失 )
         , CCur( y.税引前当期純利益 )
         , CCur( y.法人税等 )
         , CCur( y.当期純利益 )
       ) As 金額
     , x.num As 順番
FROM t_num x
   , Q試算表用Base10_損益各利益 y
ORDER BY 3
;
11
beginner 2025/08/04 (月) 16:13:17 61dd6@2128d

mayuさん ありがとうございます。それで出来ました。
x,yとした分を直積でしているのですね(自動生成されたクエリで気づきました)。
こんな方法はとても思いつきません。
細かい指摘も含め大変お世話になりました。

12
beginner 2025/08/05 (火) 08:53:53 61dd6@2128d

hatenaさんの2回目の回答(10)を見落としてました。失礼しました。
確かに仰る通りですね。縦に並んだ集計クエリを抜粋すると下記の様になってます。
項目  集計金額 ・・・
A   50
B    30
C   15 
D   100 
*   *
これをA-B=X、X-C=Y のX、Yを縦並びの設計はどうなりますでしょうか? 根本から考え直す必用あり?

13

下記のページの方法が参考になると思います。

レポートでの複雑な集計、グループ化(会計帳票) - hatena chips

簡単に説明すると項目マスターとは別に演算用のグループマスターを作成しておいてそれを結合して集計クエリにするという方法になります。

14
beginner 2025/08/05 (火) 11:29:44 61dd6@2128d

hatenaさん ありがとうございます。
各グループに段階的に1、-1持たして集計合計の形ですね。応用できる様に工夫してみす。
まずは参考分を理解するようにします。