2017-11-18 64 views
0

X,Y和Z有一些单独金额的表。使用laravel中的groupBy()函数求和查询

的样本数据:

Name | Amount | Date 
—————|————————|————————— 
    X | 100 | 15-11-17 
    Y |  50 | 15-11-17 
    X |  50 | 15-11-17 
    Z |  70 | 15-11-17 
    Z |  30 | 15-11-17 

现在我要显示一个表,其中X将返回一行与求和它在同一天两个值。

预期结果:

Name | Amount | Date 
—————|————————|————————— 
    X | 150 | 15-11-17 
    Y |  50 | 15-11-17 
    Z | 100 | 15-11-17 

那么,什么是对的laravel查询?我使用groupBy()。但无法获得有针对性的结果。

这里是我的laravel查询代码

$data = DB::table('transactions')     
      ->select('transactions.*') 
      ->groupBy('transactions.title_id') 
      ->whereDate('transactions.created_at', '=', $date) 
      ->get(); 

而得到这个错误持续

"SQLSTATE[42000]: Syntax error or access violation: 1055 'finance_report.transactions.id' isn't in GROUP BY 

有人请帮助

+0

请发布您尝试过的代码。 –

+0

Paul Spiegel - 我已经更新了我的问题。请检查 – Arafat

+0

我用代码块中的文本表格替换了您的图像。下次请这样做。 –

回答

0

假设您的表名是transactions,并且列和数据类似E在您的样品台 - SQL查询将

SELECT Name, SUM(Amount) as Amount, Date 
FROM transactions 
GROUP BY Name, Date 

在laravel你会写它作为

$data = DB::table('transactions')     
    ->select('Name', DB::raw('SUM(Amount) as Amount'), 'Date') 
    ->groupBy('Name', 'Date') 
    ->get(); 

您可以添加WHERE条件,你需要查询什么都。但是,如果您需要从表中选择更多列,则还需要将它们添加到groupBy()子句中。由于ONLY_FULL_GROUP_BY模式,类似transactions.*可能无法工作。但它也可能没有意义。

+0

感谢保罗。它的工作原理.... 另一个问题,我可以使用'groupBy()'中的任何'date()'函数将我的日期从时间戳转换为日期? – Arafat

+0

是的,但您需要使用'DB :: raw()'''''''> groupBy('Name' ,DB :: raw('DATE(Date)'))'。但是你应该在SELECT子句中做同样的事情:' - > select('Name',DB :: raw('SUM(Amount)as Amount' ),DB :: raw('DATE(Date)as Date'))'。 –

+0

Thanks paul。It works again。 我没有在DB中使用DB :: raw('DATE(Date)')选择“部分。只是在'groupBy()'里面 – Arafat

0

您可以使用SUM(数量)GROUPBY(日期)

+0

seravee - 根据您的查询所有金额在同一日期将总结。但我不想那样。我想在同一天的所有金额相同的名称将SUM。 – Arafat

+0

你可以试试groupBy('date','name') – seravee

+0

seravee - 是的。我得到这个错误 '“SQLSTATE [42000]:语法错误或访问冲突:1055'finance_report.transactions.id'不在GROUP BY' – Arafat