Применение фильтра к строкам таблицы в SQL Server - PullRequest
0 голосов
/ 11 октября 2018
Mid     TemplateId  FilterName      MappingValue
-----   ----------  -------------   --------------
1       1            JobCode           DC123
2       1            ServiceType       Paid
3       1            SegmentType       New
4       2            JobCode           DC123
5       2            SegmentType       New
6       3            ServiceType       Paid

Я пишу хранимую процедуру для извлечения данных из таблицы выше.

Входные параметры:

JobCode, ServiceType, SegmentType

Я хочу получить уникальную templateId сверхутаблица, если найдена какая-либо запись для вышеуказанной комбинации, если нет, она должна вернуть templateId для JobCode и ServiceType, а если она также не найдена, она должна искать SegmentType.

Пример:

  • Если JobCode = DC123, ServiceType = Paid и SegmentType = New, то код должен вернуть TemplateId = 1

  • Если JobCode = DC123, ServiceType = Free и SegmentType = New, код должен вернуть TemplateId = 2

  • Если JobCode = DC123, ServiceType = Paid и SegmentType = Old, коддолжен вернуть TemplateId = 3

1 Ответ

0 голосов
/ 11 октября 2018

Вот запрос агрегации, который вы можете использовать:

CREATE PROCEDURE [dbo].[sp_yourproc]
    @jobCode varchar(100),
    @serviceType varchar(100),
    @segmentType varchar(100)
AS
BEGIN

    DECLARE @templateId int

    SET @templateId = (SELECT TemplateId FROM yourTable GROUP BY TemplateId
        HAVING
            (MAX(CASE WHEN FilterName = 'JobCode'     THEN MappingValue END) = @jobCode OR
             @jobCode IS NULL) AND
            (MAX(CASE WHEN FilterName = 'ServiceType' THEN MappingValue END) = @serviceType OR
             @serviceType IS NULL) AND
            (MAX(CASE WHEN FilterName = 'SegmentType' THEN MappingValue END) = @segmentType OR
             @segmentType IS NULL);

    -- do something with the @templateId

END

В контексте сохраненного процесса вы можете не захотеть проверять все три имени фильтра.В этом случае я рассматриваю входной параметр NULL как действительный, что означает, что любой из трех входов может быть опущен, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...