mysql如何将简单的select转换为更复杂的查询
我有一个基本的sql查询,它获取级别1的平均分数和总分计数,并输出到csv文件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
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