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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

2031閲覧

スプレッドシートQuery関数で、数字表記だけではないデータを任意の順に並べ替えたい

takoyaki87

総合スコア19

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2022/07/19 06:19

編集2022/07/20 17:59

前提

スプレッドシートQuery関数の order by について質問です。
集計表の各列を、任意の順に並べ替えたいのですが上手くいきません。

実現したいこと

下記画像、D~G列のデータを任意の列に並べ替えたいです。

イメージ説明

具体的には

D列 → 20gの販売重量 (kg)
E列 → 80gの販売重量 (kg)
F列 → 1kgの販売重量 (kg)
G列 → 20kgの販売重量 (kg)

に並び替えたいです。

ちなみにA1セルには、以下の数式が含まれています。

=ARRAYFORMULA({ QUERY('発送管理表'!C:F, "select year(C), month(C)+1, sum(F) where C is not null group by year(C), month(C)+1 label year(C) '年', month(C)+1 '月', sum(F) '総販売重量 (kg)'" ), QUERY('発送管理表'!C:F, "select sum(F) where C is not null and (D='20g' or D='80g' or D='1kg' or D='20kg') group by year(C), month(C)+1 pivot D label sum(F) 'の販売重量 (kg)'" ) })

(↑この数式は、以前私がQuery関数について別の質問を投稿した際、 当時の回答者である qnoir 様 が書いてくださった数式を引用させて頂いております)

【引用元の投稿はこちら↓】
「スプレッドシートQuery関数で、別条件のデータをまとめて1つのコードで出力したい」
https://teratail.com/questions/5q116sch3g2lqq

(参照先のデータ一部抜粋 ↓)
イメージ説明

発生している問題・エラーメッセージ

関数 ARRAY_ROW のパラメータ 2 に一致しない行サイズがあります(20 となるべきところが 1 になっています)。

該当の数式

=ARRAYFORMULA({ QUERY('発送管理表'!C:F, "select year(C), month(C)+1, sum(F) where C is not null group by year(C), month(C)+1 label year(C) '年', month(C)+1 '月', sum(F) '総販売重量 (kg)'" ), QUERY('発送管理表'!C:F, "select sum(F) where C is not null and (D='20g' or D='80g' or D='1kg' or D='20kg') order by D asc group by year(C), month(C)+1 pivot D label sum(F) 'の販売重量 (kg)'" ) })

(↑この数式は、以前私がQuery関数について別の質問を投稿した際、当時の回答者である qnoir 様が書いてくださった数式に、order by 列 asc を組み込んだものです)

【当時の投稿はこちら↓】
「スプレッドシートQuery関数で、別条件のデータをまとめて1つのコードで出力したい」
https://teratail.com/questions/5q116sch3g2lqq

試したこと

20g、80g、1kg、20kgの昇順に並べ替えたいので、 order by 列 asc を使ってデータを昇順に並べようと試みました。

しかしこれだとエラーになります。

ここで一つ考えたのが、

・20g → 20
・80g → 80
・1kg → 1000
・20kg → 20000

とし、4つのデータのケタをg表記、かつ単位なしで表示すれば order by D asc で昇順にできるのではないかということです。

ですがこれですと、参照先データ (上記の黄色いデザインの画像) のD列「20g、80g、1kg、20kg」の表記をすべて変更することになり、データ管理の都合上できれば避けたいです。

(当データは商品販売に関わるメンバー数人で共有する予定です。そのためケタの変更された数字表記ではなく、単位のついた表記のほうが、メンバー皆にとって何のデータかがわかりやすいため表記の変更をしないようにしたいです)

「g」という単位がついたデータを任意の順に並べ替えることは、Query関数においては不可能でしょうか?
やはり参照先データの単位を外し、数字のみで表記する必要があるのでしょうか?

ご教示よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/07/19 12:11 編集

「データ管理の都合上できれば避けたい」→具体的にはどういうことですか? あと その「数式」(×ソースコード)は https://teratail.com/questions/5q116sch3g2lqq 「スプレッドシートQuery関数で、別条件のデータをまとめて1つのコードで出力したい」 で私が回答しているものです。 いかにも自分が考えた出したかのように書くのではなく、ちゃんと引用元や関連する質問を明記してください。
takoyaki87

2022/07/20 08:59

qnoir 様 ご連絡が遅くなり、申し訳ございません。 以下、修正依頼への回答を記載しておりますのでご確認をお願いいたします。 1. 「データ管理の都合上できれば避けたい」 → 当データは私個人だけでなく、商品販売に関わっているメンバー数人と共有したいと考えています。もし販売データの商品欄に単位がついていないとケタの変わった数字だけが表示されることになり、閲覧するメンバー皆にとって何のデータなのかわかりにくくなるのではと考えました。 閲覧するメンバーにとってわかりやすいデータにしたいという意味で「データ管理の都合上できれば避けたい」と書かせて頂きました。言葉足らずで大変失礼いたしました。 (質問文に具体的な説明を追記させて頂きましたので、ご確認頂ければ幸いです) 2. 「いかにも自分が考えた出したかのように書くのではなく、ちゃんと引用元や関連する質問を明記してください。」 →こちらにつきましては、私の配慮が足りておらず大変申し訳ございませんでした。おっしゃる通り、今回記載させていただいた数式は、前回の質問で qnoir 様が書いてくださった数式そのものです。 あくまで他人が書いた数式の引用である旨と、関連する質問URLを明記するのを怠っており、大変失礼いたしました。 こちらにつきましても質問文に追記させて頂きました。お手数ですが、ご確認頂いてもよろしいでしょうか?記載に不足している部分があればご指摘いただければ幸いです。 また、「ソースコード」ではなく「数式」という表記である、というご指摘もありがとうございます。
guest

回答1

0

ベストアンサー

「 order by 列 asc」なんてやっても基本的に水平方向に列を並び替えることなどできません。(TRANSPOSEと組み合わせて使うなどトリッキーな使い方をしない限り。)

ORDER BY句は、基本的に行方向のソートをするためのものです。


前の質問で、「新たに重量が追加されても無視してよい」とのこと(=抽出する重量は限定列挙)とのことだったので、下記のようにします。

①まず、データ行の先頭に、ダミーデータとして、
20g、80g、1kg、20kg それぞれ重量合計を空白にしたデータを1件ずつ計4行挿入しておきます。
(これをやらないと、4種類全部のデータがない場合にエラーになるため)

下の画像の緑色で塗った部分です。
イメージ説明

②次に、A1セルの数式(ソースコードではありません)を下記のように変えます。

=QUERY(ARRAYFORMULA({ QUERY('発送管理表'!C:F, "select year(C), month(C)+1, sum(F) where C is not null and (D='20g' or D='80g' or D='1kg' or D='20kg') group by year(C), month(C)+1 label year(C) '年', month(C)+1 '月', sum(F) '総販売重量 (kg)'" ), QUERY('発送管理表'!C:F, "select sum(F) where C is not null and (D='20g' or D='80g' or D='1kg' or D='20kg') group by year(C), month(C)+1 pivot D label sum(F) 'の販売重量 (kg)'" ) }),"select Col1,Col2,Col3,Col5,Col7,Col4,Col6")

※ 最下行の「"select Col1,Col2,Col3,Col5,Col7,Col4,Col6"」は、左から「20g、80g、1kg、20kg」 の並びにする場合です。
別の並び順にする場合はCol番号の順番を変える必要があります。
参考:
Query Language Reference (Version 0.7)

投稿2022/07/19 12:36

編集2022/07/19 14:15
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

takoyaki87

2022/07/19 22:36

前回に続き、ご回答ありがとうございます。 Query関数においてデータの並べ替えをする = order by を使えばいい、と短絡的な認識をしておりました。 「列」を並べ替える場合は Col を使うのですね。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問