2012-11-01 52 views
1

在下面的示例表中,我試圖找出一種在兩種情況下對標記進行總和的方法:第一種,當標記「C」存在於一個單一的ID,第二個,當標記'C'不存在於一個ID內(見ID 1或2)。在第一種情況下,我想在該ID內排除標記「A」的金額(請參閱下面所需的轉換表中的ID 3)。在第二種情況下,我希望不排除任何東西,並拿出與標記數量的簡單總和。如果存在另一個組中的記錄,則排除組中記錄的值v2

換句話說,對於包含標記'A'和'C'的id,我想將'A'的金額設爲零。對於不包含標記「C」但包含標記「A」的標識,將原始標記保留爲標記「A」。

我想要的輸出是在底部。我曾考慮嘗試通過id進行分區或使用EXISTS命令,但我在解決方案概念化時遇到了問題。如果你們可以看看,並指出我在正確的方向,將不勝感激:)

示例表:

id mark amount 
------------------ 
1 A  1 
2 A  3 
2 B  2 
3 A  1 
3 C  3 

需要的轉換:

id mark amount 
------------------ 
1 A  1 
2 A  3 
2 B  2 
3 A  0 
3 C  3 

所需的輸出:

mark sum(amount) 
-------------------- 
A  4 
B  2 
C  3 

回答

0

嘗試:

select 
    mark, 
    sum(amount) 
from (select 
     id, 
     mark, 
     case 
      when (mark = 'A' and id in (select id from table where mark = 'C')) then 0 
      else amount 
     end as amount 
    from table) t1 
group by mark 
1

你可以稍微修改my previous answer以及與此結束:

SELECT 
    mark, 
    sum(amount) AS sum_amount 
FROM atable t 
WHERE mark <> 'A' 
    OR NOT EXISTS (
    SELECT * 
    FROM atable 
    WHERE id = t.id 
     AND mark = 'C' 
) 
GROUP BY 
    mark 
; 

有一個現場演示at SQL Fiddle

相關問題