Создать функцию подсчета пользователей - PullRequest
0 голосов
/ 19 декабря 2018

Я получил это представление для таблицы ниже:

SELECT count(Incident.ID_Incident) 
    FROM Incident WHERE Incident.End_User = 7
        AND Incident.Date BETWEEN '2018-12-01 07:54:44' AND '2018-12-18 00:00:00';
GO

Таблица:

CREATE TABLE Incident(
ID_Incident INT         IDENTITY(1,1)   NOT NULL,
Date        DATETIME                    NULL,
End_User    INT                         NOT NULL,

Вот некоторые из значений таблицы:

('2018-12-06 12:33:05', 003),
('2018-12-13 14:32:12', 010),
('2018-12-06 01:26:03', 015),
('2018-12-04 05:38:50', 012),
('2018-12-10 19:13:08', 011),
('2018-12-12 13:28:39', 005),
('2018-12-05 11:57:29', 006),
('2018-12-17 15:28:31', 007),
('2018-12-07 01:39:22', 007),
('2018-12-12 17:01:47', 009),
('2018-12-03 09:54:26', 010);

Iнужно превратить это представление в функцию.Я не знаю, почему это не работает.

Любой совет будет отличным.

Я написал это: "

CREATE FUNCTION Total_case (@ID_End_User INT)
    RETURNS INT AS
        BEGIN
            DECLARE @ID_End_User_Search     INT

            SELECT @ID_End_User_Search = COUNT(ID_Incident)
                FROM Incident i
                    WHERE i.End_User = @ID_End_User_Search 
                        AND i.Date BETWEEN '2018-12-13 14:32:12' AND '2018-12-18 00:00:00'
                RETURN (@ID_End_User_Search)
            END

GO


DECLARE @SearchValue INT;

EXEC @SearchValue = [dbo].Total_case 
    @ID_End_User = 7;
SELECT @SearchValue AS 'Total case per user.'
GO

Редактировать: измененные теги и добавленные таблицы

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

В предложении WHERE есть одна ошибка.

WHERE i.End_User = @ID_End_User_Search 

Это должно быть:

WHERE i.End_User = @ID_End_User 
0 голосов
/ 19 декабря 2018

Проблема в том, что вы использовали переменную, которую вы создали в функции в предложении WHERE для фильтра.Он уже пуст и из-за этого вы получаете 0 результатов.Измените WHERE i.End_User = @ID_End_User_Search на WHERE i.End_User = @ID_End_User, тогда вы увидите результаты.И это из-за примера вы использовали статический диапазон дат в функции?Если нет, это неэффективная функция, вам нужно изменять свою функцию каждый раз, когда вам нужно изменить диапазон дат.

Это исправленная функция:

CREATE FUNCTION Total_case (@ID_End_User INT)
    RETURNS INT AS
        BEGIN
            DECLARE @ID_End_User_Search     INT

            SELECT @ID_End_User_Search = COUNT(ID_Incident)
                FROM Incident i
                    WHERE i.End_User = @ID_End_User
                        AND i.Date BETWEEN '2018-12-13 14:32:12' AND '2018-12-18 00:00:00'
                RETURN (@ID_End_User_Search)
            END

GO

Это лучший способ создания функции:

ALTER FUNCTION Total_case (@ID_End_User INT, @DateFrom DATETIME, @DateTo DATETIME)
    RETURNS INT AS
        BEGIN
            DECLARE @ID_End_User_Search     INT

            SELECT @ID_End_User_Search = COUNT(ID_Incident)
                FROM Incident i
                    WHERE i.End_User = @ID_End_User 
                        AND i.Date BETWEEN @DateFrom AND @DateTo
                RETURN (@ID_End_User_Search)
            END

GO

Выберите только для одного пользователя:

SELECT DBO.Total_case(7,'2018-12-01 14:32:12' ,'2018-12-19 00:00:00')

Выберите для всех пользователей:

SELECT *, DBO.Total_case(END_USER,'2018-12-01 14:32:12' ,'2018-12-19 00:00:00') TotalIncidents
FROM    (SELECT DISTINCT End_User 
        FROM Incident ) I
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...