2016-04-26 113 views
3

我是Oracle的新手,希望結果包含基於值的多個計數。例如:每個結果合併Group BY和多個計數

SELECT p.name, count(f.id) as eaten_apples, count(f.id) as eaten_oranges 
FROM food f, people p 
WHERE f.pid=p.pid 
AND f.id = 'apple' OR f.id = 'orange' 
GROUP BY p.name; 

顯然具有計數(f.id)有兩次將各自產生相同的結果,但願望是具有每吃的食物的類型的一個計數。蘋果和橘子。預期結果可能如下所示:

[0] => 
    name : john 
    eaten_apples: 3 
    eaten_oranges: 1 
[1] => 
    name : sam 
    eaten_apples: 0 
    eaten_oranges: 9 
... 

換句話說,每個結果有多個計數。在這種情況下,一個人吃的食物數量。

我的查詢現在返回兩個每個名稱的結果,我可能在SQL之外組合,但我想從SQL結果每個名稱得到一個結果。

回答

2

在Oracle中這樣分組並不習慣,但如果需要的話,它仍然是可能的。相反,更好的做法和我的建議是由nameid產生兩行,每個水果一行。

SELECT p.name, f.id, count(1) as eaten_fruit 
from food f, people p 
WHERE f.pid=p.pid 
AND (
     f.id = 'apple' OR 
     f.id = 'orange' 
    ) 
GROUP BY p.name, f.id; 

我相信,讓數據的應用程序句柄閱讀上面是更有效的,但正如我指出的那樣,有重新格式化選項。有a number of ways to transpose these row based results into columns和其他解決方案嘗試其中之一。我偏好的方法是使用專門爲此目的而引入的PIVOT operator。爲了得到結果,你想要的格式,你可以移調行轉換成列如:

select name, id from 
        (
         select p.name, f.id 
         from food f, people p 
         where f.pid = p.pid 
         and f.id in ('apple','orange') 
        ) 
pivot (
      count(id) 
      for id in (
         'apple' as eaten_apples, 
         'orange' as eaten_oranges 
        ) 
    ); 

它會工作,但不常見。

+0

謝謝,但我可以在兩排讓他們了,但應用程序將運行得更好如果在一個完成。我認爲在Oracle中執行起來太複雜了,或者更慢? – LookingToLearn

+0

@lookingtolearn,我添加到我的答案一個工作解決方案,但我不知道如果應用程序會更好。一個好的數據庫模型不應該爲了獲得消費應用程序期望的結果而進行透視或轉置。 – Spade

+0

謝謝!我結束了與ORA-00904:「id」:無效的標識符。但是,將「select name,id」更改爲「select *」使其起作用。我不知道爲什麼,但最終通過廣泛的反覆試驗獲得了他們的結果。再次,謝謝! – LookingToLearn

0

這裏是一個選擇,這將給在一個記錄每人吃蘋果和桔子的數量:

WITH cte AS 
(
    SELECT p.name, f.id 
    FROM people p LEFT JOIN food f 
     ON f.pid = p.pid 
) 

SELECT t1.name, COALESCE(t1.aCount, 0) AS eaten_apples, 
    COALESCE(t2.oCount, 0) AS eaten_oranges 
FROM people AS p 
LEFT JOIN 
(
    SELECT name, COUNT(name) AS aCount 
    FROM cte 
    WHERE id = 'apple' 
    GROUP BY name 
) AS t1 
    ON p.name = t1.name 
LEFT JOIN 
(
    SELECT name, COUNT(name) AS oCount 
    FROM cte 
    WHERE id = 'orange' 
    GROUP BY name 
) AS t2 
    ON p.name = t2.name 
+0

謝謝,但我一定在做錯事。你能明白爲什麼我會得到「ORA-00933:SQL命令未正確結束」嗎?我正在通過PHP執行。 – LookingToLearn

+0

沒有看到你的代碼,這將很難調試。你能嘗試直接在你的Oracle中運行這個查詢嗎? –