2012-11-28 42 views
3

我試圖在幾個表中獲得最大列值。例如,在下面的代碼片段中(它不起作用),我試圖 從所有3個表格A,B和C中的列名'tickvalue'中獲取MAX值。不知道如何獲取該值。t-sql查詢中的MAX函數

tickvalue列的數據類型是時間戳。

select 
c.somkey 
,MAX(a.tickvalue, b.tickvalue, c.tickvalue) as tickvalue 
from A as a 
join B as b 
on a.key = b.key 
join C as c 
on b.somekey = c.somkey 
where a.key = '<some key>' 

感謝

+0

你期望的結果記錄的第一列中得到什麼?但看起來你已經知道它將是一個空字符串。 – Igor

+0

@Igor更新代碼片段 – user1599610

+0

「它不起作用」如何體現自己? – Igor

回答

3

這不是MAX()聚合函數在TSQL是如何工作的(在這裏看到:TSQL MAX()) MAX函數中只有一個字段取得最大值。

爲了達到您想要的效果,您必須將三個值放到一個列中。這可以使用UNPIVOTPIVOT/UNPIVOT

這段代碼可能會幫助你。

CREATE TABLE #A (ID INT, tickvalue INT) 
CREATE TABLE #B (ID INT, tickvalue INT) 
CREATE TABLE #C (ID INT, tickvalue INT) 

INSERT INTO #A VALUES (1,1) 
INSERT INTO #A VALUES (2,4) 
INSERT INTO #A VALUES (3,7) 
INSERT INTO #A VALUES (4,2) 
INSERT INTO #A VALUES (5,8) 

INSERT INTO #B VALUES (1,8) 
INSERT INTO #B VALUES (2,7) 
INSERT INTO #B VALUES (3,2) 
INSERT INTO #B VALUES (4,4) 
INSERT INTO #B VALUES (5,1) 

INSERT INTO #C VALUES (1,2) 
INSERT INTO #C VALUES (2,1) 
INSERT INTO #C VALUES (3,2) 
INSERT INTO #C VALUES (4,15) 
INSERT INTO #C VALUES (5,2) 


SELECT ID, MAX(tickvalue) 
FROM 
(SELECT C.ID, A.tickvalue t1, B.tickvalue t2, C.tickvalue t3 
FROM #A AS a 
JOIN #B AS b ON a.ID = b.ID 
JOIN #C AS c ON b.ID = c.ID) p 
UNPIVOT (tickvalue FOR tsource IN (t1,t2,t3)) AS unpvt 
GROUP BY ID 

DROP TABLE #A 
DROP TABLE #B 
DROP TABLE #C 
1

Oracle有Greatest函數可以做同樣的事情。有時候我在Sql Server中寫了一個相同的文件,這個文件可以在here下找到。看看,我認爲這將有助於達到目的。

1

其它用途UNPIVOTE的

SELECT c.ID, 
     CASE WHEN a.tickvalue >= b.tickvalue THEN 
               CASE WHEN a.tickvalue >= c.tickvalue THEN a.tickvalue ELSE c.tickvalue END 
              ELSE CASE WHEN b.tickvalue >= c.tickvalue THEN b.tickvalue ELSE c.tickvalue END END 
FROM A a JOIN B b ON a.ID = b.ID 
     JOIN C c ON b.ID = c.ID