2016-05-26 45 views
0

我在數據庫上測試此查詢時遇到問題。該查詢使用了5個表格:table_1,table_2等。我想要做的是從table_1中獲得死亡總數,並從table_5中獲得一個出生總和。我希望通過table_4中的一個名爲AnimalGroup的屬性將這些總和分組,但是當我這樣做時,總和就會增加一倍。我也想檢查哪些數額更高。我已經加入了表格。我現在擁有的東西:在2個表中使用2個數據,同時也使用另一個表中的數據組

SELECT t4.AnimalGroup, SUM(t1.Amount * t3.DeathRate), SUM(t5.Amount * t3.LiveRate) 
FROM Table_1 t1, Table_2 t2, Table_3 t3, Table_4 t4, Table_5 t5 
WHERE t1.t2ID = t2.t2ID 
AND t2.t2ID = t3.t2ID 
AND t3.t4ID = t4.t4ID 
AND t4.t4ID = t5.t4ID 
GROUP BY t4.AnimalGroup 
HAVING SUM(t1.Amount * t3.DeathRate) > SUM(t5.Amount * t3.LiveRate) 

死亡總數從開始就沒有加倍,但是直到增加了更多記錄。現場總額從一開始就翻了一番。我嘗試了很多東西,但我找不到解決方案;我想我需要某種子查詢,但我不知道在哪裏。如果他們停止加倍,我應該有我需要的。我也希望看到這兩個數字。下面是我得到現在的數據:

AnimalGroup|SUMDeath|SUMLive 
--------------------------------- 
Birds  |48.6 |50.7 
Cats  |30  |28 
Insects |50  |20 
--------------------------------- 

我想是這樣的:

AnimalGroup|SUMDeath|SUMLive 
--------------------------------- 
Birds  |24.3 |25.35 
Cats  |15  |14 
Insects |25  |10 
--------------------------------- 

Create table table_1 (
t1ID integer, 
t2ID integer, 
Amount decimal(10, 4), 

Constraint pk_t1 
    primary key (t1ID), 

Constraint fk_t1 
primary key (t2ID) 
references table_2(t2ID) 
);go 

Create table table_2 (
t2ID integer, 

Constraint pk_t2 
    primary key (t2ID) 
);go 

Create table table_3 (
t2ID integer, 
t4ID integer, 
Name varchar(30), 
Deathrate decimal(10, 4), 
Liverate decimal(10,4), 

Constraint pk_t3 
    primary key (t2ID, t4ID), 
Constraint fk_t3_t2 
foreign key(t2ID) 
references table_2(t2ID), 
Constraint fk_t3_t4 
foreign key(t4ID) 
references table_4(t4ID) 
);go 

Create table table_4 (
t4ID integer, 
AnimalGroup varchar(30), 

Constraint pk_t4 
    primary key (t4ID) 
);go 

    Create table table_5 (
t5ID integer, 
t4ID integer, 

Constraint pk_t5 
primary key(t5ID), 

Constraint pk_t5_t4 
    foreign key (t4ID) 
references table_4(t4ID) 
);go 

編輯:一些示例數據,並創建腳本添加。查詢已更改。

+0

無法理解問題。查詢如何表現意外?你能展示一些樣本數據和預期的輸出嗎? – Utsav

+0

當然,給我一分鐘。 –

+0

是的,沒有一些款項仍然加倍。 –

回答

1

這可能是接近你想要什麼......

不要在派生表的group by部分。使用case表達式選擇最高的死亡率和生存率:

select AnimalGroup, dr, lr, case when dr > lr then dr else lr end 
from 
(
    SELECT t4.AnimalGroup as AnimalGroup, 
      SUM(t1.Amount * t3.DeathRate) as dr, 
      SUM(t5.Amount * t3.LiveRate) as lr 
    FROM Table_1 t1, Table_2 t2, Table_3 t3, Table_4 t4, Table_5 t5 
    WHERE t1.t1ID = t2.t2ID 
    AND t2.t2ID = t3.t3ID 
    AND t3.t3ID = t4.t4ID 
    AND t4.t4ID = t5.t5ID 
    GROUP BY t4.AnimalGroup 
) dt 
+0

'dt'到底做了什麼? –

+0

另外,我希望同時顯示這兩個數字。對不起,我忘記了這個問題。編輯。 –

+0

當您有派生表時,這些更改很容易完成。花了我4秒! – jarlh

相關問題