2010-11-30 34 views
1

我的問題是,我有了被實時生成的where子句的SELECT語句。它連接在5個桌子上。SQL計數與動態聯接WHERE

我基本上需要在表1的用戶的ID落入WHERE的範圍的各不同實例的計數。這也必須能夠在一個聲明中執行。所以,從本質上講,我不能做全局GROUP BY,因爲我需要返回其他4個表數據。

如果我能得到一個列有這樣的被複制,其中主鍵列,這將是完美的計數。現在,這是我看我的查詢:

SELECT * 
FROM TBL1 1 
     INNER JOIN TBL2 2 On 2.FK = 1.FK 
     INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
     LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE 1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00' 
ORDER BY 
     4.Column 
     , 3.Column 
     , 3.Column2 
     , 1.Date_Time_In DESC 

因此而不是選擇所有列,我會被過濾下來約5或6,但與我需要的東西就像一個總計列是TBL1的主鍵的不同計數,它適用於WHERE子句,可能會增大和縮小。

我幾乎希望有一種方法可以將相同的WHERE子句應用於子查詢,因爲我意識到這樣做可以工作,但不知道除了創建變量之外的其他方法,只是將它放在兩個地方,不要做。

+1

什麼是你的分貝? – jira 2010-11-30 19:29:27

+0

FK是您的主要關鍵嗎?如果是的話,爲什麼你不能分組?也請記住,您可以通過1個多鍵 – Mikhail 2010-11-30 19:36:42

+0

分組勢力集團我來限制數據,如果我能組將但這意味着我只根據該組由獲得一排,我需要多個結果在那裏我可以按一列,並通過多個結果計數堅持該值。 – Evidica 2010-11-30 19:49:39

回答

1

如果您使用的是SQL Server 2005或更高版本,您可以使用的AGGREGATE OVER功能之一。

SELECT * 
     , COUNT(UserID) OVER(PARTITION BY UserID) AS 'Total' 
FROM TBL1 1 
     INNER JOIN TBL2 2 On 2.FK = 1.FK 
     INNER JOIN TBL3 3 On 3.PK = 2.PK INNER JOIN TBL4 4 On 4.PK = 3.PK 
     LEFT OUTER JOIN TBL5 5 ON 4.PK = 5.PK 
WHERE 1.Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00' 
ORDER BY 
     4.Column, 3.Column, 3.Column2, 1.Date_Time_In DESC 
0

像添加:

inner join (select pk, count(distinct user_id) from tbl1 WHERE Date_Time_In BETWEEN '2010-11-15 12:00:00' AND '2010-11-30 12:00:00') as tbl1too on 1.PK = tbl1too.PK