Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql每周费用组帮助_Mysql_Sql_Date - Fatal编程技术网

mysql每周费用组帮助

mysql每周费用组帮助,mysql,sql,date,Mysql,Sql,Date,我在mysql中有以下表格: 金钱: 用户ID、日期、金额 费用: 用户ID、日期、金额 我需要一个sql语句(报告)与总额(存款金额-用户使用的金额)每周,并按用户分组,每周 这就是我到目前为止所做的: SELECT expenses.userid AS user, MONTH(expenses.date) AS month, SUM(money.amount) AS amount_money, SUM(expenses

我在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普普韦达35000

2012年10月7日fmonsalves 45000

2012-09-07阿布斯托斯55000

2012-09-07阿布斯托斯50000

2012-08-09阿布斯托斯100000

2012年8月21日csuarez 130000

2012年8月9日fmonsalves 100000

费用:

我想要这样的东西:

用户:csuarez

周:2012年8月19日2012年8月25日

货币:13万

费用:115898

谢谢你的帮助

请试试这个:

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;
根据eggyal的评论,您可以在
周内使用
模式
功能获取一周的第一个星期一。

op给出样本数据后的后一次更新:


要导出一周中“开始”的星期一的日期(从星期一到星期日的几周),可以使用以下表达式:

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
表表示从该帐户取款

用户有可能有一周的时间取款但没有存款,或者有一周的时间存款但没有取款。对两个表使用联接操作的查询可以排除行。而外部联接只能解决一半的问题

根据您的描述,听起来您确实想要一个包含本周所有取款和所有存款的查询

一种方法是使用UNION ALL操作组合两个单独表中的行:

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
上添加唯一约束可能会有问题。

Use?我使用了YEARWEEK,但金额不一样。@user1977586添加了另一个查询,该查询使用
week
mode
将周一作为第一天。请试一试。您能否将数据作为一组DDL提供(即创建和插入语句)。@user1977586这是从哪里来的
19-08-2012 25-08-2012
?:)我使用了左连接,假设用户应该有钱消费,所以用户可能没有费用,但必须有钱:)您将希望使用模式1、3、5或7中的一种,以便将星期一视为一周的第一天(根据OP的问题)。@eggyal谢谢:)抱歉,我的网络连接非常慢,将更新查询。谢谢大家!!但这句话乘以每个用户的金额,这句话得出这样的结果:userid=csuarez,week=201221,amount\u money=630000,expenses\u amount=180000,deposit=450000,其中该周的用户只有一行:userid=csuarez,amount=30000,date=2012-05-24@user1977586添加了不同的
请重试。顺便说一句,《年度周刊》似乎也支持这种模式。所以你可以选择其中之一。您是否有可能向我们展示两个表的小样本数据..注意:当用户的“钱”或“费用”中有一行时,此查询的输出将仅包括该周的“周”。。。用户缺少“周”意味着该周两个表中都没有行。
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_