-7

そのため、2 つの Mysql テーブルを取得しましたが、次のクエリを実行するのに苦労しています。

クエリ: 都市ごとの月ごとの販売額を取得する

ユーザー ID、名前、都市

sales *id, user_id, name, amount, date (datetime)*

私はから始めましたSELECT MONTHNAME(datetime) AS month GROUP BY month.

前もって感謝します!

4

3 に答える 3

1

任意の月および/または売り上げのない都市の数値を 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ヶ月までの範囲に対応します。

于 2013-05-10T13:26:56.120 に答える
1

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に慣れていないので、それを認識しておく必要があります;)

于 2013-05-10T11:10:12.170 に答える