2012-01-20 88 views
2

我有一張表,我希望從中選擇一個列的子集,但也會在計算列的最後添加一個計算列,這取決於您在某個隊列中的位置。有以下字段(即是相關的):計算列在SQL中的問題

ID:INT,自動增加,主鍵 answertime:日期時間,可爲空

默認情況下,當事情被提交到隊列中,其answertime爲NULL。所以,我希望選擇隊列中的東西的ID以及它在隊列中的等級(即等級1是未答覆的下一個等等)。這是我在想什麼:

rank - id - COUNT(ids下面我的id,其中answertime不爲空)。不過,我有這個查詢的語法問題:

SELECT id AS outerid, COUNT(
    SELECT * FROM tablename WHERE id<outerid AND answertime IS NOT NULL 
) 
FROM tablename 
WHERE answertime IS NULL; 

現在,很明顯,這是錯誤的,因爲我相當有信心,你不能嵌入聚合函數的選擇裏面,同樣翻轉SELECT和COUNT不起作用,因爲您不能在代碼中嵌入SELECT(它只能在WHERE子句中使用)。

這甚至可以只用SQL做,或者我需要在程序結束時添加一些邏輯嗎?

如果有幫助,我在SQL Server 2008上這樣做,但我懷疑這會增加任何價值。

+1

沒時間給他們一個很好的例子,但查找ROW_NUMBER函數。如果我對你的理解正確,我認爲這將是你想要的。 – HLGEM

回答

3

你可以這樣做,你不能在聚合子查詢中使用SELECT *。試試這個,這將會COUNT值作爲標量結果:

SELECT 
    id AS outerid, 
    (SELECT COUNT(Id) FROM tablename 
    WHERE id<outie.id AND answertime IS NOT NULL) 
FROM tablename outie 
WHERE answertime IS NULL; 

您可能需要使用COUNT(*)COUNT(Id)或一些列取決於你的真實意圖之間爲自己選擇。

+0

嗯,我看到我在嘗試內部SELECT查詢時缺少的東西;我錯過了FROM表名outie位,所以它可以區分ID。謝謝! – wibarr

+0

或'(SELECT COUNT(answertime)FROM tablename WHERE id

1
SELECT id AS outerid, 
(SELECT COUNT(*) FROM tablename WHERE id < outerid AND answertime IS NOT NULL) AS othercol 
FROM tablename -- ? 
WHERE answertime IS NULL; 

還,哪來的FROM語句?

+0

我將FROM語句添加到問題中;我簡化了這個從我的實際查詢,並忽略把它放在那裏。 – wibarr

0

正如@HLGEM建議的那樣,您可以使用ROW_NUMBER()來獲得您的結果。該方法涉及將tablename中的行排列id而不分區通過id分區answertimeanswertime爲NULL的每行排名之間的差異會給你與在子查詢中使用COUNT()計算的值相同的值。

這裏的方法的實現:

; 
WITH ranked AS (
    SELECT 
    *, 
    Rnk  = ROW_NUMBER() OVER (      ORDER BY id), 
    PartRnk = ROW_NUMBER() OVER (PARTITION BY answertime ORDER BY id) 
    FROM tablename 
) 
SELECT 
    id, /* AS outerid, if you like */ 
    Cnt = Rnk - PartRnk 
FROM ranked 
WHERE answertime IS NULL