【问题标题】:Mysql count columns values based on conditionMysql根据条件计算列值
【发布时间】:2017-10-21 16:29:00
【问题描述】:

我有一个表格,其中包含 daymonthyeartotal_payments 列。我必须根据daysmonthsyears 计算total_payments

如何计算值?

我在想这样的代码:

select 
    month, year, sum(total_payments) 
from 
    webassignment.subscription_stats 
group by 
    day;

select 
    month, year, sum(total_payments) 
from 
    webassignment.subscription_stats 
group by 
    month;

select 
    month, year, sum(total_payments) 
from 
    webassignment.subscription_stats 
group by 
    year;

但它不会返回正确的答案。我想按天、按月、按年计算total_payments。请帮我找到值。

示例输入:

Day Month   Year    Total_payments
10  01      2008    10
10  01      2008    20
11  02      2008    10
10  03      2010    10

输出:

逐日:

day month year total_payments
-----------------------------
10  01    2008 30
11  02    2008 10
10  03    2010 10

按月和按年相同

【问题讨论】:

  • 能否提供一些预期结果的样本数据?
  • 请编辑您的帖子以在此处添加示例数据。不建议在 cmets 中发布示例数据。

标签: mysql count conditional-statements


【解决方案1】:

您可以使用 GROUP BY WITH ROLLUP 按年、月和日获得汇总:

SELECT
    `Year`,
    `Month`,
    `Day`,
    SUM(`Total_payments`) as `Totals`
FROM `webassignment`.`subscription_stats`
GROUP BY `Year`,`Month`,`Day` WITH ROLLUP;

如果您想单独查询年、月和日:

按年份:

SELECT
    `Year`,
    SUM(`Total_payments`) as `Totals`
FROM `webassignment`.`subscription_stats`
GROUP BY `Year`
ORDER BY `Year;

按月:

SELECT
    `Year`,
    `Month`,
    SUM(`Total_payments`) as `Totals`
FROM `webassignment`.`subscription_stats`
WHERE `Year` = 2017
GROUP BY `Year`,`Month`
ORDER BY `Year`,`Month`;

按天:

SELECT
    `Year`,
    `Month`,
    `Day`,
    SUM(`Total_payments`) as `Totals`
FROM `webassignment`.`subscription_stats`
GROUP BY `Year`,`Month`,`Day`
ORDER BY `Year`,`Month`,`Day`;

【讨论】:

  • Sloan Thrasher 这个查询好几年了。但是几个月我只能根据月年获得单个总值。因为它为同一年和同一月提供了多行。然后我还得再数相同的年份和月份
  • 我的回答中有 4 个查询。你说的是哪一个?另外,我应该在最后 3 个查询中添加与 group by 子句匹配的 order by 子句。
  • 月份查询应该为每个年/月组合返回一行。如果您想要所有年份的月份(结果中最多 12 行),请从分组依据中删除年份列。如果您想限制一年中的月份,请添加 where 子句。
  • 我说的是第三个查询,它给出了几个月的结果。实际上它工作正常,但是由于您按年和月使用分组,它多次给出相同的年和月行。这里几个月我只想要一年中的单行,例如:(月-年,total_payments)=(02- 2008,30)
  • 好的。但是我必须在 where 子句中添加哪个条件才能使其按月添加。我不能添加静态值 2017。我希望所有记录都使用这个
【解决方案2】:

一种方法可以是在联合上使用,以显示基于不同级别的不同结果

  select day, month,year,sum(total_payments) 
  from webassignment.subscription_stats group by day, month,year
  union 
  select null, month,year,sum(total_payments) 
  from webassignment.subscription_stats group by month,year
  union 
  select null, null ,year,sum(total_payments) 
  from webassignment.subscription_stats group by year
  order by year, month, day

你提供的样本应该够用了

  select day, month,year,sum(total_payments) 
  from webassignment.subscription_stats group by day, month,year
  order by day, month,year

【讨论】:

  • 感谢 scaisEdge 的回答。但是这个查询不能正常工作
  • 这主要是对可能解决方案的建议..您有错误吗?或者结果不像您喜欢的那样?--为您的样本更新任何方式的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2018-04-29
  • 2021-07-30
  • 1970-01-01
  • 2022-09-22
相关资源
最近更新 更多