Мы можем попробовать использовать подход CTE, обеспечивающий большую читаемость и гибкость для модификаций, если потребуется в будущем.Я добавил индексы в столбец RequiredDate для повышения производительности.Надеюсь, это поможет.
IF OBJECT_ID('dbo.InputUsers') IS NULL
BEGIN
CREATE TABLE dbo.InputUsers (
UserNameID INT NOT NULL,
UserName NVARCHAR(MAX),
RequiredDate DATETIME,
Value1 DECIMAL,
Value2 DECIMAL
)
CREATE NONCLUSTERED INDEX IX_Users_RequiredDate
ON dbo.InputUsers (RequiredDate);
END
DECLARE @Start1 NVARCHAR(20), @End1 NVARCHAR(20), @Start2 NVARCHAR(20), @End2 NVARCHAR(20)
SET @Start1 = '2018-05-26'
SET @End1 = '2018-05-27'
SET @Start2 = '2018-05-28'
SET @End2 = '2018-05-29'
INSERT INTO InputUsers(UserNameID, UserName, RequiredDate, Value1, Value2) VALUES
(1, 'Adam', '2018-05-29', 13, 25),
(1, 'Adam', '2018-05-28', 12, 25),
(1, 'Adam', '2018-05-27', 11, 25),
(1, 'Adam', '2018-05-26', 10, 25),
(2, 'Lisa', '2018-05-29', 19, 25),
(2, 'Lisa', '2018-05-28', 18, 25),
(2, 'Lisa', '2018-05-27', 17, 25),
(2, 'Lisa', '2018-05-26', 16, 25),
(3, 'John', '2018-05-29', 16, 25),
(3, 'John', '2018-05-28', 17, 25),
(3, 'John', '2018-05-27', 18, 25),
(3, 'John', '2018-05-26', 19, 25),
(4, 'Bill', '2018-05-29', 10, 25),
(4, 'Bill', '2018-05-28', 11, 25),
(4, 'Bill', '2018-05-27', 12, 25),
(4, 'Bill', '2018-05-26', 13, 25)
;WITH PercentageValues1 AS (SELECT UserNameID, UserName, SUM(Value1)*100 / SUM(Value2) AS Percentage
FROM dbo.InputUsers
WHERE RequiredDate >= @Start1 AND RequiredDate <= @End1
GROUP BY UserNameID, UserName
),
PercentageValues2 AS (SELECT UserNameID, UserName, SUM(Value1)*100 / SUM(Value2) AS Percentage
FROM dbo.InputUsers
WHERE RequiredDate >= @Start2 AND RequiredDate <= @End2
GROUP BY UserNameID, UserName
)
SELECT pv2.UserName, pv1.Percentage, pv2.Percentage
FROM PercentageValues2 pv2
LEFT JOIN PercentageValues1 pv1 ON
pv2.UserNameID = pv1.UserNameID
WHERE pv2.Percentage > pv1.Percentage