簡體   English   中英

如何重做此查詢?

[英]How to rework this query?

我的數據庫表具有這樣的重要列:

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

我想得到這樣的結果:

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

我已經通過以下查詢完成了該操作:

select distinct component as cmp ,project_id,
(select count(severity) from issue_lines where severity = 'MINOR' AND component = cmp) as minor,
(select count(severity) from issue_lines where severity = 'MAJOR' AND component = cmp) as major,
(select count(severity) from issue_lines where severity = 'CRITICAL' AND component = cmp) as critical,
(select count(severity) from issue_lines where severity = 'INFO' AND component = cmp) as info,
(select count(severity) from issue_lines where severity = 'BLOCKER' AND component = cmp ) as blocker
from issue_lines

現在,我想讓它成為現實,因為它將被大量重復使用。 但是厚臉皮的ActiveRecord execute()命令將子查詢中的cmp解析為component,最后我得到了component == component,並且它在所有文件中返回完全違規,而不是單個文件。

我可以直接通過Workbench毫無問題地創建此視圖,但這不是一個選擇。

是否可以重做我的查詢以避免與execute()命令沖突?

使用上面的示例數據,您可以使用以下方法重寫查詢。

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小提琴

可以使用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;

希望這可以幫助..

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM