2016-09-29 51 views
2

我有表如何旋轉SQL結果條目爲列(支點)

| id | value | comment | 
|--------------------------| 
| 1 | Some1 | comm1  | 
|--------------------------| 
| 2 | Some2 | comm2  | 
|--------------------------| 

和我有表B與表中的外鍵

| id | id_a |name | amount | factor | 
|--------------------------------------------| 
| 1 | 1 |Car  | 12  | 2  | 
|--------------------------------------------| 
| 2 | 1 |Bike | 22  | 5  | 
|--------------------------------------------| 
| 3 | 2 |Car  | 54  | 1  | 
|--------------------------------------------| 
| 4 | 2 |Bike | 55  | 4  | 
|--------------------------------------------| 

至於結果,我想有一個組合:

|id| value | comment | Car_Amount | Car_factor | Bike_Amount | Bike_Factor | 
|--------------------------------------------------------------------------| 
| 1| Some1 | comm1 | 12   | 2   | 22   | 5   | 
|--------------------------------------------------------------------------| 
| 2| Some2 | comm2 | 54   | 1   | 55   | 4   | 
|--------------------------------------------------------------------------| 

就我所見,它不是一個支點。但我不確定這是否是一種好的做法。我不是SQL方面的專家,但是像這樣混合表看起來完全錯誤。 我的意思是「他們」想要它作爲一個單位的結果來使用它的報告...

它可能嗎?

感謝

+0

創建一個小提琴,並張貼(sqlfiddle.com),所以我們可以看到你」已經嘗試過。如果你想通過閱讀來弄明白,看看「表別名」和「加入」 – mikeb

+0

你的表b中是否有1輛汽車和一輛自行車車道條目?或者也許只有汽車?或者其他數據? –

+0

而且,請在標籤中提供您的dbms ... –

回答

1

聚合值是這樣的:

select 
     a.id, a.value, a.comment, 
     sum(case when b.name='Car' then b.amount end) as Car_Amount, 
     sum(case when b.name='Car' then b.factor end) as Car_Factor, 
     sum(case when b.name='Bike' then b.amount end) as Bike_Amount, 
     sum(case when b.name='Bike' then b.factor end) as Bike_Factor 
from a left join b on a.id=b.id_a 
group by a.id, a.value, a.comment; 
+0

工作正常。謝謝!有沒有辦法將「汽車」和「自行車」等動態地包含進去?如果「姓名」會有不同的條目。 –

+0

@OtisOttington如果您不知道要預先旋轉的列,則需要動態SQL。 –

+0

無論如何,你應該知道要聚合哪些列以及如何,總和或最小或最大。我不認爲這是可能的 – leftjoin

1
SELECT t1.id, 
     t1.value, 
     MAX(CASE WHEN t2.name = 'Car' THEN t2.amount END) AS Car_Amount, 
     MAX(CASE WHEN t2.name = 'Car' THEN t2.factor END) AS Car_Factor, 
     MAX(CASE WHEN t2.name = 'Bike' THEN t2.amount END) AS Bike_amount, 
     MAX(CASE WHEN t2.name = 'Bike' THEN t2.factor END) AS Bike_Factor 
FROM a t1 
INNER JOIN b t2 
    ON t1.id = t2.id_a 
GROUP BY t1.id 
+0

工作正常。謝謝! –

1

試試這個

SELECT ID,value,comment, 
     SUM(CASE WHEN Name='Car' THEN Amount END) AS Car_Amount, 
     SUM(CASE WHEN Name='Car' THEN factor END) AS Car_factor , 
     SUM(CASE WHEN Name='Bike' THEN Amount END) AS Bike_Amount, 
     SUM(CASE WHEN Name='Bike' THEN factor END) AS Bike_factor 
FROM TableB 
INNER JOIN TableA on TableB.ID= TableA.id 
Group by ID,value,comment 
+1

工作正常。謝謝! –