2016-06-29 53 views
1

在SQL中可以這樣做嗎?SELECT裏面的什麼

SELECT SUM(jobRequirements.number) as total, 
    SUM(jobRequirements.number WHERE jobRequirements.type=1) as jobIT, 
    SUM(jobRequirements.number WHERE jobRequirements.type=2) as jobTourism FROM jobRequirements 

我也內加入這裏與where子句,但我必須做單獨的查詢,其中對於每個jobRequirements.type,也可以在一個查詢完成條款?

我的完整的查詢是從Laravel,它看起來像這樣:

$jobStats = DB::table('jobRequirements') 
      ->join('jobs', 'jobRequirements.job', '=', 'jobs.id') 
      ->join('types', 'jobRequirements.type', '=', 'types.id') 
      ->join('users', 'jobs.user', '=', 'users.id') 
      ->select(DB::raw('SUM(jobRequirements.number) as total, users.name')) 
      ->where('jobRequirements.active', 1) 
      ->orderBy('users.name', 'asc') 
      ->groupBy('users.id') 
      ->get(); 

有了這個,我得到總人數,但我需要按類型來獲得數之和。

更新

有了這個,有點修改,代碼@Terminus

SELECT SUM(jobReq.number) as total, users.name as user, types.name as type 
FROM jobRequirements jobReq 
INNER JOIN jobs j ON j.id = jobReq.job 
INNER JOIN types t ON t.id = jobReq.type 
INNER JOIN users u ON u.id = j.user 
WHERE jobReq.active = 1 
GROUP BY u.id, t.id 
ORDER BY u.name ASC 

我得到這個:

total | user | type 
------------------------ 
2  | user1 | type2 
5  | user2 | type6 
1  | user1 | type3 
3  | user2 | type2 

我需要在最後的是:

 | type2 | type3 | type6 | total 
--------------------------------------- 
user1 | 2  | 1  | 0  | 3 
user2 | 3  | 0  | 5  | 8 
total | 5  | 1  | 5  | 11 
+0

您正在尋找'案例... When' – Kason

+0

不知道如何laravel的作品,但你可以在'users.id'上添加另一個'group by'嗎?這將工作在直接sql – Terminus

+0

否2在同一個查詢中的子句是不可能的,但是你可以嵌套查詢(子查詢) – ArtisticPhoenix

回答

1
SELECT SUM(jobRequirements.number) as total, 
    SUM(CASE WHEN jobRequirements.type=1 THEN jobRequirements.number ELSE 0 END) as jobIT, 
    SUM(CASE WHEN jobRequirements.type=2 THEN jobRequirements.number ELSE 0 END) as jobTourism 
FROM jobRequirements 
+0

我嘗試了'CASE WHERE jobRequirements.type = 1 THEN SUM(jobRequirements.number)END作爲jobIT',但它仍然給出所有類型的mi總數,在這種情況下 –

+0

您的總需求是jobIT,jobTurism Column。 – Esty

+0

如果你想按類型求和,那麼我們可以使用分區。 – Esty

-2

你不能使用2,其中在同一個查詢子句

SELECT SUM(jobRequirements.number) as total, 
jobRequirements.number WHERE jobRequirements.type=1 as jobIT, 
jobRequirements.number WHERE jobRequirements.type=2 as jobTourism FROM jobRequirements 

但是,您可以(只是舉例)

SELECT 
     (SELECT SUM(jobRequirements.number)) as total, 
      jobRequirements.number 
    From 
      jobRequirements WHERE jobRequirements.type=2 

提示,我不知道是什麼任何^是手段,真的。你也可以做工會:)(不是洋蔥,不是抗議的跡象那些傢伙)

1

龍回答,簡而言之:

更改呼叫groupBy此:

->groupBy('users.id', 'types.id') 

當然,現在您將開始爲每個用戶返回更多行。


朗的答案,長:

所以Laravel可能是建立類似於下面一個查詢。 (注意jobReqjt,並u是所謂的一個別名,它基本上爲您節省了一堆打字)

SELECT SUM(jobReq.number) as total, users.name 
FROM jobRequirements jobReq 
INNER JOIN jobs j ON j.id = jobReq.job 
INNER JOIN types t ON t.id = jobReq.type 
INNER JOIN users u ON u.id = jobReq.user 
WHERE jobReq.active = 1 
GROUP BY u.id 
ORDER BY u.name ASC 

要通過user.id秩序,type.id您可以添加t.id像這樣的GROUP BY條款:

SELECT SUM(jobReq.number) as total, users.name 
FROM jobRequirements jobReq 
INNER JOIN jobs j ON j.id = jobReq.job 
INNER JOIN types t ON t.id = jobReq.type 
INNER JOIN users u ON u.id = jobReq.user 
WHERE jobReq.active = 1 
GROUP BY u.id, t.id 
ORDER BY u.name ASC 

新編輯

有這樣的事情作爲SQL中的一個PIVOT命令,可能可以讓你得到你想要的,但是,我討厭試圖寫這些語句。我的專業人士認爲,較簡單的解決方案是循環查詢的結果,構建一個數組來保存數據,格式可以在顯示時使用不同的循環進行循環。下圖:

$jobStats = DB::table('jobRequirements') 
      ->join('jobs', 'jobRequirements.job', '=', 'jobs.id') 
      ->join('types', 'jobRequirements.type', '=', 'types.id') 
      ->join('users', 'jobs.user', '=', 'users.id') 
      ->select(DB::raw('users.name, types.id, SUM(jobRequirements.number) as total')) 
      ->where('jobRequirements.active', 1) 
      ->orderBy('users.name', 'asc') 
      ->orderBy('types.id') 
      ->groupBy('users.id') 
      ->get(); 


// gather the values into an array 
$displayJobStatus = array(); 
$allTypes = array(); 
foreach($jobStats as $stat) { 
    if(array_search($stat['type'], $allTypes) === false) { 
    $allTypes[] = $stat['type']; // we need to iterate over this later 
    } 
    $displayJobStatus[$stat['name']][$stat['type']] = $stat['type']; 
} 

$allTypes = sort($allTypes); 

echo 'User Name | ' . implode(' | ', $allTypes) . ' | Total'; 
foreach($displayJobStatus as $userName => $typeTotals) { 
    echo $userName . ' | '; 
    $total = 0; 
    foreach($allTypes as $type) { 
    if(array_key_exists($type, $typeTotals)) { 
     echo $typeTotals[$type] . ' | '; 
     $total += $typeTotals[$type]; 
    } 
    } 
    echo $total . "\n"; 
} 

你可以把管道(|)到HTML表格標籤很容易從這裏我覺得:)

+0

此工作正常,但它不適合我的需要。我的意思是展出。是否有可能將第一列設置爲用戶名和第一行爲類型,然後將數值設置爲表中的適當位置。某種表格矩陣。這可以用SQL來完成,或者我需要在PHP中進行編碼? –

+0

@SpacePeasant請參閱編輯。如果這不是你所需要的,你可以試着嘲笑一些示例表格數據,然後想要輸出並將其添加到你的問題中? (作爲截圖或[sqlfiddle](http://sqlfiddle.com/)) – Terminus

+0

我編輯了我的問題。我的主要目標可能超越SQL並涉及PHP,但我可以以某種方式使SQL更容易嗎? –

相關問題