2015-02-24 3 views
0

Я создал хранимую процедуру, которая будет принимать startdate, enddate, timezone, user и hostПолучить все даты из одной таблицы и получить полные записи каждой даты из другой таблицы

и будет отображать количество всех записей по каждому день в данной датеранге.

Я создал хранимую процедуру для этого с помощью LEFT OUTER JOIN следующего моего код:

USE [database] 
GO 
/****** Object: StoredProcedure [dbo].[sp_getPageViewCountDayWise]   Script Date: 24/02/2015 10:25:11 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[sp_getPageViewCountDayWise] 

    -- Add the parameters for the stored procedure here 
    --<@Param1, sysname, @p1> <Datatype_For_Param1, , int> = <Default_Value_For_Param1, , 0>, 
    --<@Param2, sysname, @p2> <Datatype_For_Param2, , int> = <Default_Value_For_Param2, , 0> 

    @startdate DATETIME, 
    @enddate DATETIME, 
    @timezone VARCHAR(6), 
    @user varchar(500), 
    @host VARCHAR(200) 

AS 
BEGIN 

    SET NOCOUNT ON; 

    IF NULLIF(@user, '') IS NULL 
    begin 
     set @user = @host+'/%' 
    end 
    else 
    begin 
     set @user = @host+'/'[email protected]+'/%' 
    end 

    select * from [dbo].[ExplodeDates](@startdate,@enddate) 

    select CAST(a.DateTime AS DATE) AS Date, count(*) as count 
    from [dbo].[DateRange](@startdate,@enddate) AS b 
    LEFT OUTER JOIN UserLog AS a 
    ON CAST(b.thedate AS DATE) = CAST(dbo.[ConvertDateToFromTimeZone] (a.DateTime, @timezone) AS DATE) 
    and a.Url like @user 
    group by CAST(a.DateTime AS date) 

    END 

[dbo].[DateRange] является определенным пользователем функцией, которая возвращает таблицу, имеющую все даты в определенном диапазоне дат следующим образом:

GO 
/****** Object: UserDefinedFunction [dbo].[ExplodeDates] Script Date:  24/02/2015 11:12:38 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[ExplodeDates](@startdate datetime, @enddate datetime) 
returns table as 
return (
with 
N0 as (SELECT 1 as n UNION ALL SELECT 1) 
,N1 as (SELECT 1 as n FROM N0 t1, N0 t2) 
,N2 as (SELECT 1 as n FROM N1 t1, N1 t2) 
,N3 as (SELECT 1 as n FROM N2 t1, N2 t2) 
,N4 as (SELECT 1 as n FROM N3 t1, N3 t2) 
,N5 as (SELECT 1 as n FROM N4 t1, N4 t2) 
,N6 as (SELECT 1 as n FROM N5 t1, N5 t2) 
,nums as (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) as num FROM N6) 
SELECT DATEADD(day,num-1,@startdate) as thedate 
FROM nums 
WHERE num <= DATEDIFF(day,@startdate,@enddate) + 1 
); 

и

dbo.[ConvertDateToFromTimeZone] это функция, которая преобразует каждую дату в го е дается временная зона

GO 
/****** Object: UserDefinedFunction [dbo].[ConvertDateToFromTimeZone]  Script Date: 24/02/2015 11:14:03 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[ConvertDateToFromTimeZone] 
(
    -- Add the parameters for the function here 
    @date DATETIMEOFFSET, 
    @offset VARCHAR(6) 
) 
RETURNS DATETIME 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Result DATETIME 

    -- Add the T-SQL statements to compute the return value here 
    SELECT @Result= SWITCHOFFSET (@date , @offset) 
    -- Return the result of the function 
    RETURN @Result 

END 

предположим, что я хочу видеть количество записей между 2 февраля 2015 года по 5 февраля 2015 года в день должен быть результат

Date  Count 
02/02/2015 10 
03/02/2015  2 
04/02/2015  0 
05/02/2015  3 

но моя процедура возвращает что-то вроде этого

Date   Count 
NULL   2 
02/02/2015  10 
03/02/2015  2 
05/02/2015  3 

Что я делаю неправильно?

ответ

1

a.DateTime - правая сторона левого соединения и как таковая можно вернуть нули. Кажется, вам нужна левая сторона соединения, а это b.thedate. Поэтому вам следует выбрать b.thedate вместо a.DateTime в вашем запросе (и, скорее всего, это группа вместо этого).

+0

Да, это сработало спасибо много :) – Twix

Смежные вопросы