Question

I have the following stored procedure which works fine so far.

Is there a faster / better way to write this so that I don't have to add the same From line to each Select ?

My stored procedure:

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

My resulting XML:

<ranks>
  <groupCount>0</groupCount>
  <groupCount>5</groupCount>
  <groupCount>3</groupCount>
  <groupCount>6</groupCount>
  <groupCount>1</groupCount>
  <groupCount>0</groupCount>
</ranks>
Was it helpful?

Solution

It looks like you want the count of records by dateEsc, but for a specific list of dates.

My first question is: Is there a reason you are using LIKE matching?

The SQL below might give you the expected outcome:

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')

OTHER TIPS

I think the other posted queries will not show the values when count is zero.

Here is my effort -

 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')
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top