1

私はmysqlに次のテーブルを持っています:

お金:

ユーザーID、日付、金額

費用:

ユーザーID、日付、金額

週ごとの合計(預金金額 - ユーザーが使用した金額)と、ユーザーごとのグループ、週ごとのSQL文(レポート)が必要です

これは私がこれまでに持っているものです:

SELECT   expenses.userid      AS user,
         MONTH(expenses.date) AS month,
         SUM(money.amount)    AS amount_money,
         SUM(expenses.amount) AS expenses_amount
FROM     expenses INNER JOIN money ON money.userid = expenses.userid
GROUP BY 1,2 WITH ROLLUP

(月曜日は週の最初の日です)

サンプルデータ:

お金:

2012-11-05 アブストス 70000

2012-11-05 psepulveda 35000

2012-10-07 fmonsalves 45000

2012-09-07 アブストス 55000

2012-09-07 アブストス 50000

2012-08-09 アブストス 100000

2012-08-21 クアレス 130000

2012-08-09 fmonsalves 100000

費用:

2012-05-24    csuarez     30000

2012-08-29    csuarez     30000

2012-08-22    csuarez     7990

2012-08-22    csuarez     21220

2012-08-23    csuarez     45577

私はこのようなものが欲しい:

ユーザー: csuarez

週: 19-08-2012 25-08-2012

お金: 130000

費用: 115898

ご協力いただきありがとうございます!

4

2 に答える 2

1

これを試してください:

SELECT money.userid as user, 
yearweek(expenses.date) as `week`, 
sum(money.amount) as amount_money, 
sum(expenses.amount) as expenses_amount,
sum(money.amount - expenses.amount) as deposit 
FROM money
LEFT JOIN expense
ON money.userid = expenses.userid 
group by `week`, money.userid;

egyal のコメントに従って、関数mode内で使用しweekて週の最初の月曜日を取得できます。 参照

SELECT money.userid as user, 
week(expenses.date, 1) as `week`, 
sum(distinct money.amount) as amount_money, 
sum(distinct expenses.amount) as expenses_amount,
sum(money.amount - expenses.amount) as deposit 
FROM money 
LEFT JOIN expense
ON money.userid = expenses.userid 
group by `week`, money.userid;

opがサンプルデータを提供した後の後の更新:

于 2013-01-14T15:09:00.170 に答える
1

週 (月曜日から日曜日までの週) を「開始」する月曜日の日付を取得するには、次のような式を使用できます。

mydate + INTERVAL IF(DAYOFWEEK(mydate)-1,2-DAYOFWEEK(mydate),-6) DAY 
  AS starting_monday

同様に、週の「終了」日曜日の日付値を導出するには、次のようにします。

mydate + INTERVAL IF(DAYOFWEEK(mydate)-1,8-DAYOFWEEK(mydate),0) DAY 
  AS ending_sunday

moneyしかし、テーブルがアカウントへの預金 (残高ではない) をexpenses表し、テーブルがアカウントからの引き出しを表すと仮定すると、それは実際にはクエリの問題ではありません。

ユーザーは、引き出しはあるが預金がない週、または預金があって引き出しがない週が 1 週間ある可能性があります。2 つのテーブルで JOIN 操作を使用するクエリでは、行が除外される可能性があります。そして、OUTER JOIN は問題の半分しか解決しません。

あなたの説明から、その週のすべての引き出しとすべての預金を含むクエリが必要なように思えます。

1 つの方法は、UNION ALL 操作を使用して 2 つの別個のテーブルの行を結合することです。

SELECT 'm' AS m_or_e
     , m.userid
     , m.date
     , m.amount
  FROM money
 UNION ALL
SELECT 'e'
     , e.userid
     , e.date
     , -1.00*e.amount AS amount
  FROM expenses

その後、そのクエリをインライン ビューとして参照できます。ただし、大規模なセットの場合、中間 (派生) テーブルが作成されるため、問題のあるパフォーマンスが発生します。

これは理想的とは言えません:

SELECT t.userid
     , t.week_
     , SUM(t.amount) AS total
     , SUM(IF(t.source='m',t.amount,0)) AS amount_money
     , SUM(IF(t.source='e',t.amount,0)) AS expenses_amount
  FROM (
         SELECT 'm' AS source
              , m.userid
              , YEARWEEK(m.date,1) AS week_
              , SUM(m.amount) AS amount
           FROM money m
          GROUP BY m.userid, week_
          UNION ALL
         SELECT 'e' AS source
              , e.userid
              , YEARWEEK(e.date,1) AS week_
              , -1.00*SUM(e.amount)
           FROM expenses e
          GROUP BY e.userid, week_
        ) t
 GROUP BY t.userid, t.week_

このようなクエリの場合、理想的には、「預金」と「引き出し」が同じテーブルに記録され、預金と引き出しが正の金額と負の金額、または「お金」と「費用」を区別する識別子として格納されます。

また、どちらのテーブルにも主キーまたは一意のキーが記録されていませんが、userid,dateまたはに一意の制約を追加するuserid,date,amountと問題が発生する可能性があります。

于 2013-01-14T17:19:50.940 に答える