Как включить NULL или Ноль в качестве значения для пропущенных месяцев в данных - PullRequest
0 голосов
/ 21 июня 2019

В данных у нас нет записей за несколько месяцев. Но мы хотим иметь значение NULL или 0 для пропущенных месяцев для группы штата и города. (только для месяцев меньше максимального месяца)

Данные как

State   City    Month   Sales
Texas   A   Jan 78
Texas   A   Feb 45
Texas   A   April   32
Texas   A   May 56
Texas   A   July    22
Idaho   B   Jan 24
Idaho   B   Mar 77
Idaho   B   April   23
Idaho   B   Jun 55
Idaho   B   July    99

Ожидаемый результат

Texas   A   Jan 78
Texas   A   Feb 45
Texas   A   Mar NULL  or  0
Texas   A   April   32
Texas   A   May 56
Texas   A   Jun NULL  or  0
Texas   A   July    22
Idaho   B   Jan 24
Idaho   B   Feb NULL  or  0
Idaho   B   Mar 77
Idaho   B   April   23
Idaho   B   May NULL  or  0
Idaho   B   Jun 55
Idaho   B   July    99

1 Ответ

0 голосов
/ 21 июня 2019

Надеюсь, у тебя все отлично. Вы можете использовать приведенный ниже запрос, чтобы получить желаемый результат. Вам нужно просто заменить @ MyTable на YourTableName , а также удалить объявление @ MyTable и всех INSERT INTO @ MyTable запросов. .

DECLARE @Date DATETIME2 = '2019-01-01';
DECLARE @MyTable AS TABLE
    (
      ID INT IDENTITY(1, 1) ,
      State VARCHAR(500) ,
      City VARCHAR(500) ,
      Month VARCHAR(500) ,
      Sales DECIMAL(18, 2)
    )
DECLARE @ResultTable AS TABLE
    (
      ID INT IDENTITY(1, 1) ,
      State VARCHAR(500) ,
      City VARCHAR(500) ,
      Month VARCHAR(500) ,
      Sales DECIMAL(18, 2)
    )
INSERT  INTO @MyTable
        SELECT  'Texas' ,
                'A' ,
                'Jan' ,
                78
INSERT  INTO @MyTable
        SELECT  'Texas' ,
                'A' ,
                'Feb' ,
                45
INSERT  INTO @MyTable
        SELECT  'Texas' ,
                'A' ,
                'April' ,
                32
INSERT  INTO @MyTable
        SELECT  'Texas' ,
                'A' ,
                'May' ,
                56
INSERT  INTO @MyTable
        SELECT  'Texas' ,
                'A' ,
                'July' ,
                22
INSERT  INTO @MyTable
        SELECT  'Idaho' ,
                'B' ,
                'Jan' ,
                24
INSERT  INTO @MyTable
        SELECT  'Idaho' ,
                'B' ,
                'Mar' ,
                77
INSERT  INTO @MyTable
        SELECT  'Idaho' ,
                'B' ,
                'April' ,
                23
INSERT  INTO @MyTable
        SELECT  'Idaho' ,
                'B' ,
                'Jun' ,
                55
INSERT  INTO @MyTable
        SELECT  'Idaho' ,
                'B' ,
                'July' ,
                99

DECLARE @DistinctStates AS TABLE
    (
      StateID INT IDENTITY(1, 1) ,
      StateName VARCHAR(500)
    )
INSERT  INTO @DistinctStates
        SELECT DISTINCT
                State
        FROM    @MyTable
DECLARE @_MinStateID INT= 1;
DECLARE @_MaxStateID INT= ( SELECT  MAX(StateID)
                            FROM    @DistinctStates
                          )
WHILE @_MinStateID <= @_MaxStateID
    BEGIN
        DECLARE @_StateName VARCHAR(500)= ( SELECT TOP 1
                                                    StateName
                                            FROM    @DistinctStates
                                            WHERE   StateID = @_MinStateID
                                          )
        DECLARE @_City VARCHAR(500)= ( SELECT TOP 1
                                                City
                                       FROM     @MyTable
                                       WHERE    State = @_StateName
                                     )
        DECLARE @Min INT= 1
        DECLARE @Max INT= 12
        WHILE @Min <= @Max
            BEGIN
                DECLARE @_Month VARCHAR(150) = ( FORMAT(@Date, 'MMM') );
                IF EXISTS ( SELECT TOP 1
                                    1
                            FROM    @MyTable
                            WHERE   State = @_StateName
                                    AND Month = @_Month )
                    BEGIN
                        INSERT  INTO @ResultTable
                                ( State ,
                                  City ,
                                  Month ,
                                  Sales
                                )
                                SELECT  State ,
                                        City ,
                                        Month ,
                                        Sales
                                FROM    @MyTable
                                WHERE   State = @_StateName
                                        AND Month = @_Month
                    END
                ELSE
                    BEGIN
                        INSERT  INTO @ResultTable
                                ( State ,
                                  City ,
                                  Month ,
                                  Sales
                                )
                                SELECT  @_StateName ,
                                        @_City ,
                                        @_Month ,
                                        0
                    END
                SET @Date = DATEADD(DAY, 1, @Date);
                SET @Min = @Min + 1
            END
        SET @_MinStateID = @_MinStateID + 1
    END
SELECT * FROM @ResultTable
...