2013-03-18 166 views
1

SQL Outputing列名我想這樣做,以得到一個查詢的輸出列名:基於子查詢

SELECT  queuename 
FROM  queue 
WHERE  queue.queuename LIKE 'CLIENT VIP%' and queue.status = 1 

而對於我要表示每個隊列的不同用戶的行:

FROM   queue INNER JOIN 
         queue_users ON queue.queueid = queue_users.queueid INNER JOIN 
         users ON queue_users.userid = users.userid 
WHERE  queue.queuename LIKE 'CLIENT VIP%' and queue.status = 1 and userstatus = 1 

所以對於出放我會是這樣的:

User QueueA QueueB QueueC 
---------------------------------- 
Bob  Bob  Null Bob 
Joe  Joe  Joe  Joe 
Bill Bill Null Null 

這是即使在SQL可能的,或者我需要在別的東西中處理查詢的輸出?

NOTE:我不能假設我知道輸出的queuenames。

+0

它可能在SQL服務器有一個透視功能。但是,如果您打算在其他方面顯示它,則可能會同時進行處理更爲簡單。 – 2013-03-18 23:51:32

回答

1

根據您的RDMBS,這裏是一個使用MAXCASE一個appoach:

SELECT users.userid, 
    users.user, 
    MAX(CASE WHEN queue.id = 'A' Then users.user END) QueueA, 
    MAX(CASE WHEN queue.id = 'B' Then users.user END) QueueB, 
    MAX(CASE WHEN queue.id = 'C' Then users.user END) QueueC 
FROM   queue INNER JOIN 
         queue_users ON queue.queueid = queue_users.queueid INNER JOIN 
         users ON queue_users.userid = users.userid 
WHERE  queue.queuename LIKE 'Otsuka VIP%' and queue.status = 1 and userstatus = 1 
GROUP BY users.userid 

SQL Fiddle Demo

您可能需要更新您的某些字段名 - 我在一些猜測。上面的SQL小提琴應該讓你在正確的方向。

- 編輯 -

鑑於最近的編輯,如果你不知道queuenames(意思是你不知道你想要多少列返回),那麼這是聽起來更像是一個演示問題而不是數據庫問題。你也許可以使用動態SQL來實現你的結果,但是再次,你最好在UI側做比DAL側更好的事情。

+0

此方法有效,但我希望在隊列數量增加時可以很好地擴展。 (查看數據後,我需要切換到用戶而不是隊列,用戶名很短,隊列名稱太長!) – NoMoreZealots 2013-03-19 01:32:45

+0

請原諒我缺乏理解。但是在這個例子中MAX語句做了什麼? – NoMoreZealots 2013-03-21 00:18:33

+0

@NoMoreZealots - 這是執行PIVOT表的一種方法。如果您使用的是Oracle或SQL Server,則可以使用PIVOT()命令進行實際調查。祝你好運。 – sgeddes 2013-03-21 14:10:06