2017-06-21 69 views
0

我的查詢有問題。我現在有2個查詢,並且工作正常。但是當我想用PIVOT添加另一個查詢時,它不起作用。我已經嘗試了很多東西,但沒有工作..合併查詢.. PIVOT不起作用

這是我第一次兩個查詢

$query = "SET SQL_BIG_SELECTS = 1;"; 
 
$query .= "SELECT * FROM datakram, datakram2, datakram3 WHERE datakram.NAME = datakram2.NAME AND datakram2.NAME = datakram3.NAME"

而且我想添加一個PIVOT爲表「datakram4」。但我只想要名稱與其他表中的名稱相同的行。沒有PIVOT它的作品..

我的PIVOT代碼。

SELECT `name` , 
 
MAX(CASE WHEN `year` =2017 THEN `income` ELSE 0 END) AS INCOME_2017, 
 
MAX(CASE WHEN `year` =2017 THEN `expense` ELSE 0 END) AS EXPENSE_2017, 
 
MAX(CASE WHEN `year` =2016 THEN `income` ELSE 0 END) AS INCOME_2016, 
 
MAX(CASE WHEN `year` =2016 THEN `expense` ELSE 0 END) AS EXPENSE_2016 
 
FROM `test_data` GROUP BY `name`

我用multi_query我的PHP腳本。

回答

2

只需加入查詢:

SELECT d4.* 
FROM datakram d1 
INNER JOIN datakram2 d2 
    ON d1.`NAME` = d2.`NAME` 
INNER JOIN datakram3 d3 
    ON d2.`NAME` = d3.`NAME` 
INNER JOIN 
    (SELECT `name` , 
     MAX(CASE WHEN `year`=2017 THEN `income` ELSE 0 END) AS INCOME_2017, 
     MAX(CASE WHEN `year`=2017 THEN `expense` ELSE 0 END) AS EXPENSE_2017, 
     MAX(CASE WHEN `year`=2016 THEN `income` ELSE 0 END) AS INCOME_2016, 
     MAX(CASE WHEN `year`=2016 THEN `expense` ELSE 0 END) AS EXPENSE_2016 
    FROM `test_data` 
    GROUP BY `name` 
    ) d4 
    ON d3.`NAME` = d4.`name` 
+0

我已經試過這一點。但我也需要其他表中的變量。我在FULL JOIN中改變了它。但那並不奏效。 RIGHT/LEFT JOIN運作良好... – Mooelb

+0

繼續並在SELECT'子句中添加其他列,然後:'SELECT d1。*,d2。*,d3。*,d4。*'或單獨標識它們。 – Parfait

1

一個簡單的方法是WHERE子句中來過濾:

SELECT `name` , 
     MAX(CASE WHEN `year` = 2017 THEN `income` ELSE 0 END) AS INCOME_2017, 
     MAX(CASE WHEN `year` = 2017 THEN `expense` ELSE 0 END) AS EXPENSE_2017, 
     MAX(CASE WHEN `year` = 2016 THEN `income` ELSE 0 END) AS INCOME_2016, 
     MAX(CASE WHEN `year` = 2016 THEN `expense` ELSE 0 END) AS EXPENSE_2016 
FROM `test_data` td 
WHERE EXISTS (SELECT 1 FROM FROM datakram d WHERE d.name = td.NAME) AND 
     EXISTS (SELECT 1 FROM FROM datakram2 d WHERE d.name = td.NAME) AND 
     EXISTS (SELECT 1 FROM FROM datakram3 d WHERE d.name = td.NAME) 
GROUP BY `name` ;