2014-04-04 54 views
0

我有以下存儲過程,迄今爲止工作正常。SQL Server:合併來自聯盟的所有行選擇

是否有更快/更好的方式來編寫此代碼,以便我不必將相同的從行添加到每個選擇?

我的存儲過程:

ALTER PROCEDURE [dbo].[CountEsc] 
    @date0 nvarchar(20), 
    @date1 nvarchar(20), 
    @date2 nvarchar(20), 
    @date3 nvarchar(20), 
    @date4 nvarchar(20), 
    @date5 nvarchar(20) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_Esc 
    WHERE  dateEsc LIKE @date0+'%' 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_Esc 
    WHERE  dateEsc LIKE @date1+'%' 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_Esc 
    WHERE  dateEsc LIKE @date2+'%' 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_Esc 
    WHERE  dateEsc LIKE @date3+'%' 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_Esc 
    WHERE  dateEsc LIKE @date4+'%' 
     UNION ALL 
    SELECT  COUNT(*) AS groupCount 
    FROM  Log_Esc 
    WHERE  dateEsc LIKE @date5+'%' 

    FOR XML PATH(''), ROOT('ranks') 
END 

我得到的XML:

<ranks> 
    <groupCount>0</groupCount> 
    <groupCount>5</groupCount> 
    <groupCount>3</groupCount> 
    <groupCount>6</groupCount> 
    <groupCount>1</groupCount> 
    <groupCount>0</groupCount> 
</ranks> 

與此的任何幫助,蒂姆非常感謝。

+0

會的日期始終是相同的長度?日期總是不一樣嗎? –

+0

是的,日期總是相同的長度(格式:yyyy-mm,例如2014-04),並且總是會有所不同。 – user2571510

+0

您可以發佈樣本數據和預期結果的模擬嗎? –

回答

1

它看起來像你想通過dateEsc記錄的計數,但對於特定的日期列表。

我的第一個問題是:你有使用LIKE匹配的原因嗎?

下面的SQL可能會給你期望的結果:

SET NOCOUNT ON; 

SELECT COUNT(*) AS groupCount 
    FROM Log_Esc 
    WHERE dateEsc LIKE @date0+'%' 
    OR dateEsc LIKE @date1+'%' 
    OR dateEsc LIKE @date2+'%' 
    OR dateEsc LIKE @date3+'%' 
    OR dateEsc LIKE @date4+'%' 
    OR dateEsc LIKE @date5+'%' 
    GROUP BY dateEsc 

FOR XML PATH(''), ROOT('ranks') 
+0

謝謝你。我使用LIKE作爲輸入格式僅爲yyyy-mm,所以這樣我就可以從同一個月獲取所有記錄。 – user2571510

+0

這對我不起作用,因爲它返回13而不是6個值,不知道它在那裏有什麼。 – user2571510

1

我想其他公佈的查詢將不會顯示值時,計數爲零。

這裏是我的努力 -

Create Table #temp 
    (
    date Datetime NULL 
    ) 
    Insert into #temp values (CONVERT(VARCHAR(10),@date0,110)) 
    Insert into #temp values (CONVERT(VARCHAR(10),@date1,110)) 
    Insert into #temp values (CONVERT(VARCHAR(10),@date2,110)) 
    Insert into #temp values (CONVERT(VARCHAR(10),@date3,110)) 
    Insert into #temp values (CONVERT(VARCHAR(10),@date4,110)) 
    Insert into #temp values (CONVERT(VARCHAR(10),@date5,110)) 


     SELECT  
     sum(Case when dateEsc is null then 0 else 1 end) AS groupCount 
     FROM  #temp t1 left join dateEsc t2 on t1.date = CONVERT(VARCHAR(10),dateEsc,110) 
     group by date 
     FOR XML PATH(''), ROOT('ranks') 
+0

謝謝。這看起來不錯,不幸的是我無法使用它,因爲我沒有權限在此服務器上運行CREATE TABLE。我可以聲明臨時表嗎? – user2571510

+0

在那個例子中,我只使用了#temp表。具有最基本權限的登錄擁有完整的權限來創建和使用臨時表。 – Wumar

+0

您也可以使用表變量---'DECLARE @Temp TABLE ( date datetime NULL )' – Wumar