【问题标题】:How to use SUMIF or any sql query to aggregate the result or results of survey data?如何使用 SUMIF 或任何 sql 查询来聚合调查数据的结果或结果?
【发布时间】:2018-09-06 13:40:35
【问题描述】:

我在仪表板中使用了一个查询来对调查回复进行排序。我想要的是让我的查询添加 ff 即的结果。

'Male - In Love' + 'Female - In Love'; 
'Male - Like' + 'Female - Like'; 
'Male - Facepalm' + 'Female - Facepalm'; 
'Male - Crying' + 'Female - Crying';

这是我用来对个人回复进行排序的查询:

顺便说一句,我正在使用 laravel 5.4 和 mysql

public function getDataTwo(Request $request){
    $data = DB::connection('mysql')->select(DB::raw("SELECT 
        DATE(`created_at`) as 'DATE',
        SUM(IF(`responses`=1,1,0)) as 'Male - In Love',
        SUM(IF(`responses`=2,1,0)) as 'Male - Like',
        SUM(IF(`responses`=3,1,0)) as 'Male - Facepalm',
        SUM(IF(`responses`=4,1,0)) as 'Male - Crying',
        SUM(IF(`responses`=5,1,0)) as 'Female - In Love',
        SUM(IF(`responses`=6,1,0)) as 'Female - Like',
        SUM(IF(`responses`=7,1,0)) as 'Female - Facepalm',
        SUM(IF(`responses`=8,1,0)) as 'Female - Crying'
        FROM `answers` 
        WHERE DATE(`created_at`) BETWEEN DATE('$request->startDate') AND
        DATE('$request->endDate')                             
        AND TIME(`created_at`) BETWEEN TIME('$request->startDate') AND 
        TIME('$request->endDate')
        -- AND driverid = ('*')
        -- AND busid = ('*')
        -- AND routeid = ('*')
        -- AND questionid = ('*') 
        GROUP BY DATE(`created_at`)"
    )); //Array and Result nito
    $tempArr = array();
    if(count($data)==0){return $data;}
    $xcnt=0;
    foreach ($data[0] as $key => $value) {
        if($key=='DATE'){continue;}
        $tempArr[$xcnt]=array("name"=>$key,"y"=>(int)$value);
        $xcnt++;
    }
    $data = json_encode($tempArr);
    return $data;
}

【问题讨论】:

  • 实际发生了什么?你期待发生什么?寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定问题或错误必要的最短代码 在问题本身中重现它。没有明确的问题陈述的问题对其他读者没有用处。见:How to create a Minimal, Complete, and Verifiable example.

标签: php mysql sql laravel laravel-5.4


【解决方案1】:

您使用的是 MySQL,因此使用此快捷方式可以更轻松地编写查询:

SELECT DATE(created_at) as DATE,
       SUM(responses = 1) as `Male - In Love`,
       SUM(responses = 2) as `Male - Like`,
       SUM(responses = 3) as `Male - Facepalm`,
       SUM(responses = 4) as `Male - Crying`,
       SUM(responses = 5) as `Female - In Love`,
       SUM(responses = 6) as `Female - Like`,
       SUM(responses = 7) as `Female - Facepalm`,
       SUM(responses = 8) as `Female - Crying`
FROM answers 
. . .

然后,您可以轻松添加更多列:

SELECT DATE(created_at) as DATE,
       SUM(responses = 1) as `Male - In Love`,
       SUM(responses = 2) as `Male - Like`,
       SUM(responses = 3) as `Male - Facepalm`,
       SUM(responses = 4) as `Male - Crying`,
       SUM(responses = 5) as `Female - In Love`,
       SUM(responses = 6) as `Female - Like`,
       SUM(responses = 7) as `Female - Facepalm`,
       SUM(responses = 8) as `Female - Crying`,
       SUM(responses IN (1, 5)) as `Males + Females - In Love`),
       . . . 
FROM answers 
. . .

注意事项:

  • IF() 已经是非标准 SQL。您不妨使用 MySQL 更方便的“将布尔值视为数字”扩展。
  • 仅对字符串和日期常量使用单引号。不要将它们用作列别名。

【讨论】:

    猜你喜欢
    • 2021-10-26
    • 2021-08-28
    • 2011-02-24
    • 2014-10-22
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    相关资源
    最近更新 更多