| 
                
Please start any new threads on our new 
    site at https://forums.sqlteam.com.  We've got lots of great SQL Server
    experts to answer whatever question you can come up with. 
    
        | 
                
                    | 
                            
                                | Author | Topic |  
                                    | mike13Posting Yak  Master
 
 
                                        219 Posts | 
                                            
                                            |  Posted - 2015-03-24 : 08:27:51 
 |  
                                            | Hi,IU got this SP that returns the amount of customers that registered that month and did not have a sucessfull order (status=8)the Changedate is filed that had the registration date.ALTER PROCEDURE [dbo].[SP_STATS_GET_TOTAL_new_customer_with_NO_orders]@totals as nvarchar(100) output,@site as varchar(50),@month as CHAR(2),@year as CHAR(4) ASDECLARE @ADate DATETIMEDECLARE @amountdaysinmonth intSET @ADate = @year +'-' + @month +'-01'set @amountdaysinmonth=DAY(EOMONTH(@ADate)) SELECT    @totals=COUNT(distinct T_Order_Main.CustomerID)FROM     dbo.T_Customer INNER JOIN             dbo.T_Order_Main ON dbo.T_Customer.CustomerID = dbo.T_Order_Main.CustomerIDWHERE   (dbo.T_Order_Main.Orderstatus <> 8) and    dbo.T_Customer.changedate BETWEEN cast(@year as varchar) + '-' + cast(@month as varchar) + '-01 00:00:00' AND cast(@year as varchar) + '-' + cast(@month as varchar)   +'-'+ CAST(@amountdaysinmonth AS varchar)  +' 23:59:59'                       AND (dbo.T_Customer.site = @site)AND NOT T_Order_Main.CustomerID IN                 (SELECT   distinct T_Order_Main.CustomerIDFROM     dbo.T_Customer INNER JOIN             dbo.T_Order_Main ON dbo.T_Customer.CustomerID = dbo.T_Order_Main.CustomerIDWHERE   (dbo.T_Order_Main.Orderstatus = 8) AND  dbo.T_Customer.changedate BETWEEN cast(@year as varchar) + '-' + cast(@month as varchar) + '-01 00:00:00' AND cast(@year as varchar) + '-' + cast(@month as varchar)    +'-'+ CAST(@amountdaysinmonth AS varchar)  + ' 23:59:59'  AND (dbo.T_Customer.site = @site))Thanks a lot |  |  
                                    | gbrittonMaster Smack Fu Yak Hacker
 
 
                                    2780 Posts | 
                                        
                                          |  Posted - 2015-03-24 : 08:52:19 
 |  
                                          | No idea what you want to do here.  Does the proc work?  If so, what's the problem?  If not, how does it fail? |  
                                          |  |  |  
                                    | KristenTest
 
 
                                    22859 Posts | 
                                        
                                          |  Posted - 2015-03-24 : 10:43:27 
 |  
                                          | [code]dbo.T_Customer.changedate    BETWEEN cast(@year as varchar) + '-' + cast(@month as varchar) + '-01 00:00:00'    AND cast(@year as varchar) + '-' + cast(@month as varchar) +'-'+ CAST(@amountdaysinmonth AS varchar) +' 23:59:59'[/code]Will have lousy performance, and there is probably one millisecond at the end of the month that will escape this testChange it to[code]dbo.T_Customer.changedate >= @StartDate AND dbo.T_Customer.changedate < @EndDate[/code]Precalculate both @StartDate and @EndDate because if you leave a complex formula in the WHERE clause there is a high chance that SQL will not be able to use any suitable index.Don't fiddle about with string dates with punctuation like "-" because if the server locale setting changes, or the user connects with a different LANGUAGE setting, or a host of other such things your assumptions about date will fail.  The only valid string date to use which is guaranteed UNambiguous is 'yyyymmdd' or ISO format 'yyyy-mm-ddThh:mm:ss'[code]SELECT @StartDate = CONVERT(datetime, @year + @month + '01'),       @EndDate = DATEADD(Month, 1, @StartDate)[/code] |  
                                          |  |  |  
                                    | mike13Posting Yak  Master
 
 
                                    219 Posts | 
                                        
                                          |  Posted - 2015-03-24 : 10:43:51 
 |  
                                          | Sorry it performs real slow! |  
                                          |  |  |  
                                    | KristenTest
 
 
                                    22859 Posts | 
                                        
                                          |  Posted - 2015-03-24 : 10:46:25 
 |  
                                          | quote:My suggestion, above, on Date Range test may help.If not: what indexes do you have on the tables?Originally posted by mike13
 Sorry it performs real slow!
 
 |  
                                          |  |  |  
                                    | ScottPletcherAged Yak Warrior
 
 
                                    550 Posts | 
                                        
                                          |  Posted - 2015-03-24 : 13:20:30 
 |  
                                          | [code]ALTER PROCEDURE [dbo].[SP_STATS_GET_TOTAL_new_customer_with_NO_orders]  @totals as nvarchar(100) output,  @site as varchar(50),  @month as CHAR(2),  @year as CHAR(4)ASSET NOCOUNT ON;SELECT @totals = COUNT(*)FROM dbo.T_Order_MainWHERE CustomerID IN (    SELECT CustomerID    FROM dbo.T_Customer     WHERE        changedate >= @year + RIGHT('0' + @month, 2) + '01' AND        changedate < DATEADD(MONTH, 1, CAST(@year + RIGHT('0' + @month, 2) + '01' AS date)) AND        site = @site    )    GROUP BY CustomerIDHAVING MAX(CASE WHEN Orderstatus = 8 THEN 1 ELSE 0 END) = 0 --verify no successful orderAND MAX(CASE WHEN Orderstatus <> 8 THEN 1 ELSE 0 END) = 1 --Edit: verify unsuccessful order[/code] |  
                                          |  |  |  
                                |  |  |  |  |  |