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

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

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

3654閲覧

クロス集計を完成させたい

yyy

総合スコア49

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/02/09 02:09

編集2016/02/09 04:22

###前提・実現したいこと
クロス集計を使って月別・カテゴリ別の合計販売額を一覧にして各月ごと1行にまとめ、カテゴリは1から10までIDごとに集計して横に並べて表示したい。

###発生している問題・エラーメッセージ
My SQLで以下のコードを実行すると、B.SaleDateをGROUP BYに入れる必要がある旨のメッセージが表示されます。
しかし、ここでGROUP BYをしたいのは年月日まで抽出されるSaleDateではなく、年月を抽出したSUBSTR(B.SaleDate, 1, 7)なので、うまくグループ化できずに困っています。
###ソースコード
My SQL もしくは SUBSTRをMidに変換してAccess

SELECT
SUBSTR(B.SaleDate, 1, 7) AS 年月
,SUM(CASE WHEN A.CategoryID = 1 THEN A.Price * B.Quantity ELSE 0 END) AS Ct1
,SUM(CASE WHEN A.CategoryID = 2 THEN A.Price * B.Quantity ELSE 0 END) AS Ct2
,SUM(CASE WHEN A.CategoryID = 3 THEN A.Price * B.Quantity ELSE 0 END) AS Ct3
,SUM(CASE WHEN A.CategoryID = 4 THEN A.Price * B.Quantity ELSE 0 END) AS Ct4
,SUM(CASE WHEN A.CategoryID = 5 THEN A.Price * B.Quantity ELSE 0 END) AS Ct5
,SUM(CASE WHEN A.CategoryID = 6 THEN A.Price * B.Quantity ELSE 0 END) AS Ct6
,SUM(CASE WHEN A.CategoryID = 7 THEN A.Price * B.Quantity ELSE 0 END) AS Ct7
,SUM(CASE WHEN A.CategoryID = 8 THEN A.Price * B.Quantity ELSE 0 END) AS Ct8
,SUM(CASE WHEN A.CategoryID = 9 THEN A.Price * B.Quantity ELSE 0 END) AS Ct9
,SUM(CASE WHEN A.CategoryID = 10 THEN A.Price * B.Quantity ELSE 0 END) AS Ct10
FROM
Products AS A
INNER JOIN
Sales AS B
ON A.ProductID = B.ProductID
GROUP BY
SUBSTR(B.SaleDate, 1, 7)
ORDER BY
SUBSTR(B.SaleDate, 1, 7)
;

###補足情報
SaleDate, Quantity →Salesテーブル
CategoryID, Price →Productsテーブル

出力項目:年月、Ct1、Ct2、Ct3、Ct4、Ct5、Ct6、Ct7、Ct8、Ct9、Ct10
出力順:年月

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ためしていないので参考になればですが・・・
SUBSTRINGは文字を切り取るので、date型には合わないのかもしれません。
date型は基準日(1970-01-01だったか)からの秒数を見やすいようにしただけなので
date_format関数で切ってみたらどうでしょうか?

SQL

1SELECT 2-- SUBSTR(B.SaleDate, 1, 7) AS 年月 3 DATE_FORMAT(B.SaleDate, '%y-%m') AS 年月 4 ,SUM(CASE WHEN A.CategoryID = 1 THEN A.Price * B.Quantity ELSE 0 END) AS Ct1 5 ,SUM(CASE WHEN A.CategoryID = 2 THEN A.Price * B.Quantity ELSE 0 END) AS Ct2 6 ,SUM(CASE WHEN A.CategoryID = 3 THEN A.Price * B.Quantity ELSE 0 END) AS Ct3 7 ,SUM(CASE WHEN A.CategoryID = 4 THEN A.Price * B.Quantity ELSE 0 END) AS Ct4 8 ,SUM(CASE WHEN A.CategoryID = 5 THEN A.Price * B.Quantity ELSE 0 END) AS Ct5 9 ,SUM(CASE WHEN A.CategoryID = 6 THEN A.Price * B.Quantity ELSE 0 END) AS Ct6 10 ,SUM(CASE WHEN A.CategoryID = 7 THEN A.Price * B.Quantity ELSE 0 END) AS Ct7 11 ,SUM(CASE WHEN A.CategoryID = 8 THEN A.Price * B.Quantity ELSE 0 END) AS Ct8 12 ,SUM(CASE WHEN A.CategoryID = 9 THEN A.Price * B.Quantity ELSE 0 END) AS Ct9 13 ,SUM(CASE WHEN A.CategoryID = 10 THEN A.Price * B.Quantity ELSE 0 END) AS Ct10 14FROM 15 Products AS A 16 INNER JOIN 17 Sales AS B 18 ON A.ProductID = B.ProductID 19GROUP BY 20-- SUBSTR(B.SaleDate, 1, 7) 21 DATE_FORMAT(B.SaleDate, '%y-%m') 22ORDER BY 23-- SUBSTR(B.SaleDate, 1, 7) 24 DATE_FORMAT(B.SaleDate, '%y-%m') 25; 26

投稿2016/02/09 09:41

roast_chicken

総合スコア254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyy

2016/02/10 00:48

MySQLなのにDATE_FORMATを認識してくれませんでした…。 SUBSTRINGに問題はなさそうだったので、サブクエリで年月を先に抽出して、外でもそれを使うことにしました。見た目がきれいでなかったので違う方法を探したのですがそれしかできないみたいでした。 今後DATE型で困ることが絶対出てくると思うのでその時には参考にさせていただきます。ありがとうございました。
guest

0

ベストアンサー

My SQL詳しくないのでソースコードは出せませんが、下記アドレスの用Select文の中にSelect文を作りSUBSTR(B.SaleDate, 1, 7)を中側のセレクト文で加工後、外側セレクト文でグループ化したら如何ですか。
http://www.ken3.org/cgi-bin/test/test105-2.asp

投稿2016/02/09 08:46

編集2016/02/09 08:48
kakeru

総合スコア63

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyy

2016/02/10 00:41

いろいろ試してみましたが、やはりその方法しかないのですね…。 人間から見たら回りくどい(というか何をしているかわかりにくい)形になるので他にいい方法があればよかったのですけど…。 以下のようになりました。 SELECT B.年月 ,SUM(CASE WHEN A.CategoryID = 1 THEN A.Price * B.Quantity ELSE 0 END) AS Ct1 ,SUM(CASE WHEN A.CategoryID = 2 THEN A.Price * B.Quantity ELSE 0 END) AS Ct2 ,SUM(CASE WHEN A.CategoryID = 3 THEN A.Price * B.Quantity ELSE 0 END) AS Ct3 ,SUM(CASE WHEN A.CategoryID = 4 THEN A.Price * B.Quantity ELSE 0 END) AS Ct4 ,SUM(CASE WHEN A.CategoryID = 5 THEN A.Price * B.Quantity ELSE 0 END) AS Ct5 ,SUM(CASE WHEN A.CategoryID = 6 THEN A.Price * B.Quantity ELSE 0 END) AS Ct6 ,SUM(CASE WHEN A.CategoryID = 7 THEN A.Price * B.Quantity ELSE 0 END) AS Ct7 ,SUM(CASE WHEN A.CategoryID = 8 THEN A.Price * B.Quantity ELSE 0 END) AS Ct8 ,SUM(CASE WHEN A.CategoryID = 9 THEN A.Price * B.Quantity ELSE 0 END) AS Ct9 ,SUM(CASE WHEN A.CategoryID = 10 THEN A.Price * B.Quantity ELSE 0 END) AS Ct10 FROM ( SELECT C.ProductID ,C.Quantity ,SUBSTR(C.SaleDate, 1, 7) AS 年月 FROM Sales AS C ) AS B INNER JOIN Products AS A ON B.ProductID = A.ProductID GROUP BY B.年月 ORDER BY B.年月 ; ご助言ありがとうございました。
guest

0

テーブル名の前にデータベース名を付けたら通りませんか?
dbname.Products みたいに

投稿2016/02/09 04:02

au2010

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yyy

2016/02/09 04:18

Productsのエイリアス名を消したら「所属テーブル名.Products」のような形で通るようになりました。 しかし、ここで質問しているのはそのようなことではないのですが。 最終的にクロス集計を完成させたいのであってエイリアス名云々は現在の状況を述べたまでです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問