Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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/67.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如何将简单的select转换为更复杂的查询_Mysql_Sql - Fatal编程技术网

mysql如何将简单的select转换为更复杂的查询

mysql如何将简单的select转换为更复杂的查询,mysql,sql,Mysql,Sql,我有一个基本的sql查询,它获取级别1的平均分数和总分计数,并输出到csv文件 SELECT judge,AVG(score), count(judge) FROM results WHERE judge NOT LIKE '% AND %' AND score >30 AND (class like '%1st%' OR class LIKE '%first%' OR class LIKE '%1 st%') GROUP BY judge INTO OUTFILE 'c

我有一个基本的sql查询,它获取级别1的平均分数和总分计数,并输出到csv文件

SELECT judge,AVG(score), count(judge) 
FROM results 
WHERE judge NOT LIKE '% AND %' 
  AND score >30 
  AND (class like '%1st%' OR class LIKE '%first%' OR class LIKE '%1 st%')
GROUP BY judge 
INTO OUTFILE 'c:/py/2013/all/judges-by-level.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';
我想展开此查询,以获取从类列的字符串值My current level 1派生的多个级别的平均分数,其中如下所示: 类“%1st%”或类“%first%”或类“%1 st%” 我想更改此查询以使用类似的 类“%2nd%”或类“%second%”或类“%2 nd%”

原始数据如下所示:

我想要的输出是一个csv文件,格式如下:


我将使用什么样的SQL语法来获得所需的输出?

是否要基于第一/1/1 st和第二/2/2 nd进行交叉制表

作为一个侧面点,比如。。。或者像。。。或者可以用正则表达式代替,以缩短内容

假设我正确理解了你的问题,这应该接近你所需要的:

SELECT
  judge,
  AVG(case when class rlike '1st|first|1 st' THEN score END) level1_avg,
  COUNT(case when class rlike '1st|first|1 st' THEN judge END) level1_count,
  AVG(case when class rlike '2nd|second|2 nd' THEN score END) level2_avg,
  COUNT(case when class rlike '2nd|second|2 nd' THEN judge END) level2_count
FROM results
where judge not like '% and %' AND score > 30
group by judge
INTO OUTFILE 'c:/py/2013/all/judges-by-level.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';
要分解level1_avg结果列,请执行以下操作:

如果类包含1st或first或1st,则案例返回分数,因此它包含在平均值中。 如果类不包含1st、first或1st,则案例返回null,因此它不包含在平均值中。
其他聚合列使用类似的逻辑。

是否尝试联合?虽然经过这么多关卡后,这不会有效率。请注意,INTO OUTFILE和ORDER BY在最终union子句中

SELECT judge, AVG(score) as 'level1_avg', count(judge) as 'level1_count', '' as 'level2_avg', '' as 'level2_count', '' as 'level3_avg', '' as 'level3_count'  
FROM results 
WHERE judge NOT LIKE '% AND %' 
   AND score >30 
   AND (class like '%1st%' OR class LIKE '%first%' OR class LIKE '%1 st%')
GROUP BY judge

UNION ALL

SELECT judge, '' as 'level1_avg', '' as 'level1_count', AVG(score) as 'level2_avg', count(judge) as 'level2_count', '' as 'level3_avg', '' as 'level3_count'
FROM results 
WHERE judge NOT LIKE '% AND %' 
   AND score >30 
   AND (class like '%2nd%' OR class LIKE '%second%' OR class LIKE '%2 nd%')
GROUP BY judge    

UNION ALL

SELECT judge, '' as 'level1_avg', '' as 'level1_count', '' as 'level2_avg', '' as 'level2_count', AVG(score) as 'level3_avg', count(judge) as 'level3_count' 
   INTO OUTFILE 'c:/py/2013/all/judges-by-level.csv'
   FIELDS TERMINATED BY ','
   LINES TERMINATED BY '\r\n';
FROM results 
WHERE judge NOT LIKE '% AND %' 
   AND score >30 
   AND (class like '%3rd%' OR class LIKE '%third%' OR class LIKE '%3 rd%')
GROUP BY judge   
ORDER BY judge

编辑:在联合体的相应列中添加空格

这看起来非常好。我注意到的唯一一件事是,当比赛中没有裁判实例时,我需要将值设置为0-这是一个我需要修正的结果:Joe Smoe,\N,0,\N,0OK,这很有意义。在这种情况下,我会将计数包装在一个合并中,例如,当类rlike'1st | first | 1st'然后judge END,0 level1_count时,COALESCECOUNTcase。这看起来很有趣,但会重复judge的值。我正在寻找交叉列表,非常感谢!
SELECT
  judge,
  AVG(case when class rlike '1st|first|1 st' THEN score END) level1_avg,
  COUNT(case when class rlike '1st|first|1 st' THEN judge END) level1_count,
  AVG(case when class rlike '2nd|second|2 nd' THEN score END) level2_avg,
  COUNT(case when class rlike '2nd|second|2 nd' THEN judge END) level2_count
FROM results
where judge not like '% and %' AND score > 30
group by judge
INTO OUTFILE 'c:/py/2013/all/judges-by-level.csv'
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n';
SELECT judge, AVG(score) as 'level1_avg', count(judge) as 'level1_count', '' as 'level2_avg', '' as 'level2_count', '' as 'level3_avg', '' as 'level3_count'  
FROM results 
WHERE judge NOT LIKE '% AND %' 
   AND score >30 
   AND (class like '%1st%' OR class LIKE '%first%' OR class LIKE '%1 st%')
GROUP BY judge

UNION ALL

SELECT judge, '' as 'level1_avg', '' as 'level1_count', AVG(score) as 'level2_avg', count(judge) as 'level2_count', '' as 'level3_avg', '' as 'level3_count'
FROM results 
WHERE judge NOT LIKE '% AND %' 
   AND score >30 
   AND (class like '%2nd%' OR class LIKE '%second%' OR class LIKE '%2 nd%')
GROUP BY judge    

UNION ALL

SELECT judge, '' as 'level1_avg', '' as 'level1_count', '' as 'level2_avg', '' as 'level2_count', AVG(score) as 'level3_avg', count(judge) as 'level3_count' 
   INTO OUTFILE 'c:/py/2013/all/judges-by-level.csv'
   FIELDS TERMINATED BY ','
   LINES TERMINATED BY '\r\n';
FROM results 
WHERE judge NOT LIKE '% AND %' 
   AND score >30 
   AND (class like '%3rd%' OR class LIKE '%third%' OR class LIKE '%3 rd%')
GROUP BY judge   
ORDER BY judge