2010-09-19 36 views
3

我正在使用子查詢將計數作爲整數值返回到我的主查詢。此查詢用於重新綁定ASP.NET DataGrid,並且此列只有兩個可用的字符寬度。我想限制寬度爲兩個字符。所以,當計數超過99時,我想設置99的值。我無法想出辦法做到這一點?我看不出如何在這裏應用案例陳述。在sql查詢中強制使用上限來計數(*)

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    SELECT COUNT(*) 
FROM SessionOrder 
WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 
    And SessionOrder.SORD_NumberCompleteDownloads <> 0 
    As MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member 

這怎麼辦?

+0

您確定您當前的查詢有效嗎? – 2010-09-19 14:49:18

+0

我忽略了一些細節,但足以顯示我正在嘗試的內容。 – Jim 2010-09-19 14:57:15

回答

1

CASE表達式可以是這樣的:

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END 

似乎有一對夫婦與您現有的查詢錯誤(例如m未定義)。隨着糾正這些錯誤和變更進行結果查詢看起來是這樣的:

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    (
     SELECT CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END 
     FROM SessionOrder 
     WHERE SessionOrder.SORD_MEMB_ID = MEMB_ID 
     AND SessionOrder.SORD_NumberCompleteDownloads <> 0 
    ) AS MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member 
+0

好吧,所以我將不得不實際執行子查詢兩次才能做到這一點?我希望避免這種情況,但也許我別無選擇? – Jim 2010-09-19 14:55:52

+0

@Jim:你爲什麼需要執行兩次子查詢? – 2010-09-19 14:59:40

+0

我會放棄它!看起來像贏家!非常感謝! – Jim 2010-09-19 15:02:06

2

更換

COUNT(*) 

隨着

CASE WHEN COUNT(*) > 99 THEN 99 ELSE COUNT(*) END AS YourColumnName 
0

情況下,它應該是...

0

或雙UNION作爲 選擇 MEMB_ID, MEMB_Name, SELECT COUNT (*)AS WC FROM SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 而SessionOrder.SORD_NumberCompleteDownloads <> 0 和WC = 作爲MEMB_Dow nloads, MEMB_JoinDate 從會員 UNION SELECT MEMB_ID, MEMB_Name, 99 AS WC FROM SessionOrder WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 而SessionOrder.SORD_NumberCompleteDownloads <> 0 和WC> 99 作爲MEMB_Downloads, MEMB_JoinDate FROM Member

1

這可能會更有效一些。因爲它可以在到達第99個時停止掃描行。

SELECT MEMB_ID , 
     MEMB_Name, 
     (SELECT COUNT(*) 
     FROM ( 
       SELECT TOP 99 * 
       FROM SessionOrder 
       WHERE SessionOrder.SORD_MEMB_ID = MEMB_ID 
       AND  SessionOrder.SORD_NumberCompleteDownloads <> 0 
       ) 
       Top99 
     ) AS MEMB_Downloads, 
     MEMB_JoinDate 
FROM Member 
+0

馬丁,謝謝你的極限。是的,這應該會更好。 – Jim 2010-10-02 23:45:56

+0

「SELECT TOP 99 *」:只選擇ID或其他東西,不要浪費處理器。 (如果你幸運的話,系統會爲你猜出。) – ANeves 2010-12-02 20:17:17

1

而不是在99改變COUNT(*)的結果,更好的計數:

SELECT 
    MEMB_ID, 
    MEMB_Name, 
    (SELECT COUNT(*) 
     FROM (
     SELECT TOP(99) * 
     FROM SessionOrder 
     WHERE SessionOrder.SORD_MEMB_ID = m.MEMB_ID 
     And SessionOrder.SORD_NumberCompleteDownloads <> 0) 
     as TOP99_Downloads) 
    As MEMB_Downloads, 
    MEMB_JoinDate 
FROM Member; 

這樣你可以避免計算所有下載的時候,你會只顯示99無妨。當然,有人會問,如果開始時顯示值不正確,爲什麼不讓UI層能顯示'超過99'。

+0

謝謝,這個限制是有道理的。我有一個數據網格中的幾個計數器,可用空間非常有限。我的客戶希望在單個頁面上獲得太多信息。不是我怎麼會想要它!謝謝 – Jim 2010-10-02 23:45:19

+0

@收件人:實際上'*'是最好的選擇。使用'*',上面的COUNT運算符可以自由計算*任何*列,並且查詢優化器將選擇可以使用最窄可能索引進行計數的列。 – 2010-12-02 21:28:26

+0

其實我以前的評論是錯誤的,謝謝@Remus Rusanu。 [先前的評論被刪除。] *是最好的選擇,並且如果有空值(未計數),則計算特定列而不是*可能會產生意想不到的結果。 – ANeves 2010-12-09 15:52:59