Надеюсь, у тебя все отлично. Вы можете использовать приведенный ниже запрос, чтобы получить желаемый результат. Вам нужно просто заменить @ 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