C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

AccessでのSQLについて

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■97993 / inTopicNo.1)  AccessでのSQLについて
  
□投稿者/ 鏡月 (61回)-(2021/08/19(Thu) 13:11:58)

分類:[Microsoft Office 全般] 

2021/08/19(Thu) 13:26:49 編集(投稿者)

お世話になっております。

SQLの作成方法が分からない為、ご存知の方がおりましたらご教授お願い致します。

SQL1:SELECT 製番, 作業グループ, SUM(材料費) AS 合計材料費, SUM(外注費) AS 合計外注費 FROM T_製番別原価集計 WHERE 本体OP種別 = 0 AND 製番='11930028' GROUP BY 製番, 作業グループ
出力データ
製番 作業グループ 合計材料費 合計外注費
11930028 GC 870489 180425
11930028 GE 992217 14270
11930028 GJ 519093 838755
11930028 GK 286781 86620
11930028 GS 11208 131270
11930028 GU 22564 7960
11930028 GV 939477 67840
11930028 PE 100650 0
11930028 PM 663119 352050
11930028 セイ 0 0

SQL2:SELECT 製番, 作業グループ, SUM(材料費) AS 合計材料費, SUM(外注費) AS 合計外注費 FROM T_製番別原価集計 WHERE 本体OP種別 = 1 AND 製番='11930028' GROUP BY 製番, 作業グループ
出力データ
製番 作業グループ 合計材料費 合計外注費
11930028 PE 38984 650
11930028 PM 158000 0
11930028 UM 510116 1024610

出力したいデータ
製番 作業グループ 合計材料費 合計外注費 合計材料費 合計外注費
11930028 GC 870489 180425
11930028 GE 992217 14270
11930028 GJ 519093 838755
11930028 GK 286781 86620
11930028 GS 11208 131270
11930028 GU 22564 7960
11930028 GV 939477 67840
11930028 PE 100650 0 38984 650
11930028 PM 663119 352050 158000 0
11930028 セイ 0 0
11930028 UM 510116 1024610

下記URLを参考に外部結合を作成してみたのですが出力したいデータ通りにはデータが出力されませんでした。
URL:https://www.accessdbstudy.net/entry/20080705/p1

引用返信 編集キー/
■97994 / inTopicNo.2)  Re[1]: AccessでのSQLについて
□投稿者/ 魔界の仮面弁士 (3164回)-(2021/08/19(Thu) 13:27:55)
No97993 (鏡月 さん) に返信
> 製番 作業グループ 合計材料費 合計外注費 合計材料費 合計外注費
「合計材料費」「合計外注費」という名前の列が複数ありますね。
これだと、列名競合のエラーになってしまいます。

「OP0材料費」「OP1材料費」などのように、列名を変更してはいけないのですか?


SELECT 製番, 作業グループ
, SUM(IIF(本体OP種別 = 0, 材料費, NULL)) AS OP0合計材料費
, SUM(IIF(本体OP種別 = 0, 外注費, NULL)) AS OP0合計外注費
, SUM(IIF(本体OP種別 = 1, 材料費, NULL)) AS OP1合計材料費
, SUM(IIF(本体OP種別 = 1, 外注費, NULL)) AS OP1合計外注費
FROM T_製番別原価集計
WHERE 製番='11930028' AND 本体OP種別 IN (0, 1)
GROUP BY 製番, 作業グループ
引用返信 編集キー/
■97995 / inTopicNo.3)  Re[1]: AccessでのSQLについて
□投稿者/ 魔界の仮面弁士 (3165回)-(2021/08/19(Thu) 13:37:49)
No97993 (鏡月 さん) に返信
> 2021/08/19(Thu) 13:26:49 編集(投稿者)

修正前のコードでは UNION を試しておられるようだったので、
UNION 版も載せておきます。IIF 関数が許可されていない場合向け。
JOIN は不要だったので取り除いてあります。

SELECT 製番, 作業グループ
, SUM(OP0材料費) AS OP0合計材料費
, SUM(OP0外注費) AS OP0合計外注費
, SUM(OP1材料費) AS OP1合計材料費
, SUM(OP1外注費) AS OP1合計外注費
FROM (
SELECT 製番, 作業グループ
, 材料費 AS OP0材料費
, 外注費 AS OP0外注費
, NULL AS OP1材料費
, NULL AS OP1外注費
FROM T_製番別原価集計
WHERE 製番='11930028' AND 本体OP種別 = 0
UNION ALL
SELECT 製番, 作業グループ
, NULL AS OP0材料費
, NULL AS OP0外注費
, 材料費 AS OP1材料費
, 外注費 AS OP1外注費
FROM T_製番別原価集計
WHERE 製番='11930028' AND 本体OP種別 = 1
)
GROUP BY 製番, 作業グループ
引用返信 編集キー/
■97996 / inTopicNo.4)  Re[2]: AccessでのSQLについて
□投稿者/ 鏡月 (62回)-(2021/08/19(Thu) 13:52:39)
No97995 (魔界の仮面弁士 さん) に返信
> 製番 作業グループ 合計材料費 合計外注費 合計材料費 合計外注費
「合計材料費」「合計外注費」という名前の列が複数ありますね。
これだと、列名競合のエラーになってしまいます。
⇒わかりにくい書き方になってしまい申し訳ございません。
 「合計材料費」「合計外注費」は参照元テーブルが違いますので一応エラーにならず出力することが出来ました。

自分になりにSQLを作成してみて同様の結果を得られましたが魔界の仮面弁士様が作成したSQLの方がすっきりしておりますので一度内容の理解をしたいと思います。

不要だと思いますが私が作成したSQLになります。

SELECT
SWITCH(本体.製番 IS NULL, オプション.製番, 本体.製番 IS NOT NULL, 本体.製番) AS 製番
,SWITCH(本体.作業グループ IS NULL, オプション.作業グループ, 本体.作業グループ IS NOT NULL, 本体.作業グループ) AS 作業グループ
,本体.合計材料費
,本体.合計外注費
,オプション.合計材料費
,オプション.合計外注費
FROM
(
SELECT * FROM
(
SELECT *
FROM
(SELECT 製番, 作業グループ, SUM(材料費) AS 合計材料費, SUM(外注費) AS 合計外注費 FROM T_製番別原価集計 WHERE 本体OP種別 = 0 AND 製番='11930028' GROUP BY 製番, 作業グループ) AS 本体
RIGHT JOIN
(SELECT 製番, 作業グループ, SUM(材料費) AS 合計材料費, SUM(外注費) AS 合計外注費 FROM T_製番別原価集計 WHERE 本体OP種別 = 1 AND 製番='11930028' GROUP BY 製番, 作業グループ) AS オプション
ON オプション.製番 = 本体.製番 AND オプション.作業グループ = 本体.作業グループ
)
UNION
(
SELECT *
FROM
(SELECT 製番, 作業グループ, SUM(材料費) AS 合計材料費, SUM(外注費) AS 合計外注費 FROM T_製番別原価集計 WHERE 本体OP種別 = 0 AND 製番='11930028' GROUP BY 製番, 作業グループ) AS 本体
LEFT JOIN
(SELECT 製番, 作業グループ, SUM(材料費) AS 合計材料費, SUM(外注費) AS 合計外注費 FROM T_製番別原価集計 WHERE 本体OP種別 = 1 AND 製番='11930028' GROUP BY 製番, 作業グループ) AS オプション
ON オプション.製番 = 本体.製番 AND オプション.作業グループ = 本体.作業グループ
)
)

早急にご回答していただきありがとうございます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ