2012-06-28 53 views
1

我正在MySQL中編寫存儲過程以獲取一組管理信息。問題是:我需要「水平」而不是「垂直」的結果。更詳細地說明,這裏的數據庫設計,我得處理:在存儲過程中選擇特定值作爲列

users

  • COMPANY_ID
  • user_type_id

companies

  • COMPANY_ID

user_types

  • user_type_id
  • 描述

所以這裏的交易: 我需要數由描述分組的所有用戶,然後由公司分組。我可以給像這樣:

SELECT 
    COUNT(*) AS number, 
    ut.descriptor, 
    company_id 
FROM 
    users u 

INNER JOIN 
    user_types ut 
ON ut.user_type_id = u.user_type_id 
AND descriptor LIKE 'xyz%' 

INNER JOIN 
    companies c 
ON u.company_id = c.company_id 

GROUP BY 
    ut.descriptor, 
    company_id 

但這不過給我正確的結果,:這份名單是「垂直」。我爲每個描述符獲得一個新行。我實際上希望描述符成爲列。行應按公司分組。這就是應用程序邏輯所期望的。

我想先取出描述符,稍後再做計算,但這給我帶來了完全相同的問題。我可以爲每個描述符執行一個子查詢,但這會非常非常醜陋。

作爲總結,預期的結果是這樣的,其中3個後列是從user_types表實際上描述符:

company - admin - customer - supplier

1 - 4 - 1 - 5

1 - 7 - 4 - 2

這將轉化爲: Company 1 has 4個管理員,1個客戶,5個供應商。 公司2有7個管理員,4個客戶,2個供應商。

我真的覺得我在這裏錯過了一些東西。我忽略了什麼?

回答

2

你可以這樣做,但它不是表格的動態寬度。 ,你可能需要更換IF(ut.descriptor = 'admin' 與像IF(u.user_type_id = 1 財產以後那麼你並不需要在所有

SELECT 
    company_id AS company, 
    COUNT(IF(ut.descriptor = 'admin', 1, NULL) AS admin, 
    COUNT(IF(ut.descriptor = 'customer', 1, NULL) AS customer, 
    COUNT(IF(ut.descriptor = 'supplier', 1, NULL) AS supplier 
FROM 
    users u 

INNER JOIN 
    user_types ut 
ON ut.user_type_id = u.user_type_id 
AND descriptor LIKE 'xyz%' 

INNER JOIN 
    companies c 
ON u.company_id = c.company_id 

GROUP BY 
    company_id 
+0

嗯在UT加入...這看起來合法的。我會試試這個。 – Sherlock

+0

工程就像一個魅力! – Sherlock

相關問題