2012-02-14 116 views
1

我正在使用SQL Server 2005.SQL - 如何簡化這個簡單的查詢?

我該如何重構此查詢?

SELECT Total, Installs, Service, tot.ls_chg_dte_ojb 
    FROM (SELECT COUNT(*) [Total], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     GROUP BY ls_chg_dte_ojb) tot 

    JOIN (SELECT COUNT(*) [Service], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     WHERE job_class_ojb = 'S' 
     GROUP BY ls_chg_dte_ojb) svc on svc.ls_chg_dte_ojb = tot.ls_chg_dte_ojb 

    JOIN (SELECT COUNT(*) [Installs], ls_chg_dte_ojb 
     FROM [COMPL_INST_SVC] 
     WHERE job_class_ojb in ('C', 'R') 
     GROUP BY ls_chg_dte_ojb) ins on ins.ls_chg_dte_ojb = tot.ls_chg_dte_ojb 
+0

是,即使正確嗎?爲什麼總數只包含job_class_obj ='S'的值? – 2012-02-14 00:17:05

+1

第一個內部選擇('總')和第二個('服務')之間的區別是什麼? – deutschZuid 2012-02-14 00:17:30

+1

正如我在下面的評論中所提到的,您不應該使用單引號來分隔別名 - 此語法已被棄用。使用[方括號],「雙引號」或不使用分隔符。 – 2012-02-14 01:46:54

回答

2

的線條看起來像道達爾和服務計數的東西都指望同樣的事情,所以你需要解決這個問題,但這裏基本上是你怎麼做計數在一個簡單的方法:

SELECT 
    COUNT(CASE WHEN job_class_ojb = 'S' THEN 1 END) AS [Total], 
    COUNT(CASE WHEN job_class_ojb = 'S' THEN 1 END) AS [Service], 
    COUNT(CASE WHEN job_class_ojb in ('C', 'R') THEN 1 END) AS [Installs] 
FROM 
    [COMPL_INST_SVC] 
+1

我認爲你的意思是'SUM'而不是'COUNT' - 在這種情況下'COUNT'將在每一列中返回相同的值,因爲'COUNT'只是對行進行計數,而不是實際值。此外,您不應使用單引號分隔別名 - 此語法已被棄用。使用[方括號],「雙引號」或不使用分隔符。 – 2012-02-14 01:46:37

+1

在某些情況下,SUM可以返回NULL,這可能是一個問題。出於這個原因,最好使用「COUNT」。 – 2012-02-14 01:51:49

+0

單引號確實被棄用。我應該更新我的答案。 – 2012-02-14 01:52:18

2

你的兩個子選擇是相同的。忽略了「服務」,請嘗試沿着

SELECT 
SUM(CASE WHEN job_class_ojb = 'S' THEN 1 ELSE 0 END) as Total, 
SUM(CASE WHEN job_class_ojb = 'C' or 
       job_class_ojb = 'R' THEN 1 ELSE 0 END) as Installs 
FROM COMPL_INST_SVC 
1

我懷疑總計子查詢不應包括WHERE job_class_ojb = 'S'條件 - 如果是的話,我建議:

SELECT COUNT(*) Total, 
     SUM(CASE WHEN job_class_ojb = 'S' THEN 1 ELSE 0 END) Service, 
     SUM(CASE WHEN job_class_ojb in ('C','R') THEN 1 ELSE 0 END) Installs, 
     ls_chg_dte_ojb 
FROM COMPL_INST_SVC 
GROUP BY ls_chg_dte_ojb 
+0

你的答案是唯一一個包括'GROUP BY'但我更喜歡使用'COUNT' – CodingIsAwesome 2012-02-15 07:24:46