そのため、2 つの Mysql テーブルを取得しましたが、次のクエリを実行するのに苦労しています。
クエリ: 都市ごとの月ごとの販売額を取得する
ユーザー ID、名前、都市
sales *id, user_id, name, amount, date (datetime)*
私はから始めましたSELECT MONTHNAME(datetime) AS month GROUP BY month.
前もって感謝します!
任意の月および/または売り上げのない都市の数値を 0 にしたいが、その月に他の都市の売り上げがある場合、次のようになります。
1 つは使用された月のリストを取得するため、もう 1 つは都市のリストを取得するための副選択のペアを交差結合し、レコードに対してそれらを結合して、その月/都市の金額を取得し、それらの金額を合計します。
SELECT Sub1.YearMonth, Sub2.city, SUM(sales.amount)
FROM (SELECT DISTINCT EXTRACT(YEAR_MONTH FROM `date`) AS YearMonth
FROM sales) Sub1
CROSS JOIN (SELECT DISTINCT city FROM users) Sub2
LEFT OUTER JOIN sales ON Sub1.YearMonth = EXTRACT(YEAR_MONTH FROM sales.`date`)
LEFT OUTER JOIN users ON sales.user_id = users.id AND Sub2.city = sales.city
GROUP BY Sub1.YearMonth, Sub2.city
ORDER BY Sub1.YearMonth, Sub2.city
これの欠点は、誰にも何も販売されなかった月がある場合、その月はまったく表示されないことです。これを回避するには、月のサブセレクトを変更して、代わりに開始日を取得し、それに数値の範囲を追加して各月を取得する必要があります。
範囲を生成する例は次のとおりです。
SELECT Sub1.YearMonth, Sub2.city, SUM(sales.amount)
FROM (SELECT EXTRACT(YEAR_MONTH FROM DATE_ADD('2009-01-01', INTERVAL a.i*100+b.i*10+c.i MONTH)) AS aMonth
FROM (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) a,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) b,
(SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) c
WHERE DATE_ADD('2009-01-01', INTERVAL a.i*100+b.i*10+c.i MONTH) <= '2014-12-01') Sub1
CROSS JOIN (SELECT DISTINCT city FROM users) Sub2
LEFT OUTER JOIN sales ON Sub1.YearMonth = EXTRACT(YEAR_MONTH FROM sales.`date`)
LEFT OUTER JOIN users ON sales.user_id = users.id AND Sub2.city = sales.city
GROUP BY Sub1.YearMonth, Sub2.city
ORDER BY Sub1.YearMonth, Sub2.city
この例では、2009 年 1 月 1 日から 2014 年 12 月 1 日までのすべての月を指定し、その範囲の都市別のすべての売上を取得しています。1000ヶ月までの範囲に対応します。
SQL Fiddle テスト ページがあるので、他のユーザーがソリューションを試すことができます。
これが問題のクエリです。
SELECT MONTHNAME(`date`) AS Monthly
, `city`
, SUM(`amount`) AS Profit
FROM sales
INNER JOIN users ON userid = idu
GROUP BY MONTHNAME(`date`), `city` WITH ROLLUP
を使用しWITH ROLLUP
て、月別の小計と最後に総計を追加しました。
PS:コメントに同意します。問題を解決するためにもう少し努力する必要があります。あなたはSOに慣れていないので、それを認識しておく必要があります;)