如何重写这个查询?

时间:2015-10-20 15:19:17

标签: mysql sql ruby-on-rails activerecord

我的数据库表包含如下重要列:

nuget pack

我想得到这样的结果:

name | violation
file1| major
file1| major
file1| minor
file2| minor
file2| minor

我已经通过此查询实现了这一目标:

name | minor | major etc.
file1| 1     | 2
file2| 2     | 0

现在我想把它变成视图,因为它会被重复使用。 但是厚脸皮的ActiveRecord execute()命令将cmp从子查询解析为组件,最后我得到component ==组件,它返回所有文件的完全违规,而不是单个文件。

我可以通过Workbench直接创建此视图,但这不是一个选项。

是否可以重写我的查询以避免与execute()命令发生冲突?

2 个答案:

答案 0 :(得分:1)

使用上面的示例数据,您可以使用以下方法重写查询。

SELECT  v.name,
        COUNT(CASE WHEN v.violation = 'minor' THEN 1 END) as minor,
        COUNT(CASE WHEN v.violation = 'major' THEN 1 END) as major
FROM    violations as v
GROUP BY v.name;

SQL Fiddle

答案 1 :(得分:0)

您可以使用CASE WHEN。而不是子查询。

SELECT name,
       SUM(CASE WHEN v.violation = 'minor' THEN 1 ELSE 0 END) as minor,
       SUM(CASE WHEN v.violation = 'major' THEN 1 ELSE 0 END) as major
    FROM    violations 
    GROUP BY name;

希望这会有所帮助..