Найти сумму прибыли с последней транзакции (в тот же день или в предыдущий день) в конце дня в T-SQL - PullRequest
1 голос
/ 26 июня 2011

Я задал вопрос в апреле , и @ Микаэль помог мне решить его.С тех пор требование изменилось, и я не могу понять, как построить запрос.Структура таблицы:

SID Sdate                  Profit   Units 
1   7/26/2010 9:15:00 AM    -37.5   -1      
1   7/26/2010 12:00:00 PM   -125    -1      
1   7/26/2010 12:45:01 PM   -12.5   -1      
1   7/26/2010 12:45:02 PM   0       0       
1   7/26/2010 12:45:03 PM   -75     1       
1   7/26/2010 2:00:01 PM    -12.5   1       
1   7/26/2010 2:00:02 PM    0       0       
1   7/26/2010 2:00:03 PM    -125    -1      
1   7/26/2010 2:15:00 PM    -50     -1  
1   7/27/2010 9:15:00 AM    25      -1      
1   7/27/2010 12:00:00 PM   196     -1      
1   7/27/2010 2:15:00 PM    -12.5   -1 
1   7/28/2010 9:15:00 AM    425     -1      
1   7/28/2010 12:00:00 PM   -125    -1      
1   7/28/2010 2:15:00 PM    -12.5   -1 
1   7/29/2010 9:15:00 AM    -37.5   -1      
1   7/29/2010 12:00:00 PM   -90     -1      
1   7/29/2010 12:45:01 PM   -12.5   -1      
1   7/29/2010 12:45:02 PM   0       0       
1   7/29/2010 12:45:03 PM   -75     1       
1   7/29/2010 2:15:00 PM    23      1 

Расчет объясняется следующим образом:

SID Sdate                  Profit   Units   End-of-day-Profit   Comments
1   7/26/2010 9:15:00 AM    -37.5   -1      
1   7/26/2010 12:00:00 PM   -125    -1      
1   7/26/2010 12:45:01 PM   -12.5   -1      
1   7/26/2010 12:45:02 PM   0       0       
1   7/26/2010 12:45:03 PM   -75     1       
1   7/26/2010 2:00:01 PM    -12.5   1       
1   7/26/2010 2:00:02 PM    0       0       
1   7/26/2010 2:00:03 PM    -125    -1      
1   7/26/2010 2:15:00 PM    -50     -1  -175    SUM of profit(row 9 to row 11) going back to 7/26/2010  2:00:02 PM
1   7/27/2010 9:15:00 AM    25      -1      
1   7/27/2010 12:00:00 PM   196     -1      
1   7/27/2010 2:15:00 PM    -12.5   -1  33.5    SUM of profit ( row 9 to row 14) going back to 7/26/2010  2:00:02 PM
1   7/28/2010 9:15:00 AM    425     -1      
1   7/28/2010 12:00:00 PM   -125    -1      
1   7/28/2010 2:15:00 PM    -12.5   -1  321     SUM of profit(row9 to row 17) going back to 7/26/2010  2:00:02 PM
1   7/29/2010 9:15:00 AM    -37.5   -1      
1   7/29/2010 12:00:00 PM   -90     -1      
1   7/29/2010 12:45:01 PM   -12.5   -1      
1   7/29/2010 12:45:02 PM   0       0       
1   7/29/2010 12:45:03 PM   -75     1       
1   7/29/2010 2:15:00 PM    23      1   -52     SUM of profit(row 22 to row 23) going back to 7/29/2010  12:45:02 PM

Результат будет

SID Sdate       Profit   Units
1   7/26/2010   -175    -1
1   7/27/2010   33.5    -1
1   7/28/2010   321     -1
1   7/29/2010   -52     1

Столбец суммы чистой прибыли взят в2:15 вечера каждый день для каждого SID.Я включил один SID для простоты. Идея состоит в том, чтобы оглянуться назад либо на текущий день, либо на предыдущие дни для строки с прибылью = 0 и единицами = 0.Как только эта строка найдена, суммируйте все значения прибыли.

Я ценю любую помощь по этому вопросу. Спасибо.

Ответы [ 2 ]

1 голос
/ 26 июня 2011

DDL и пример данных:

CREATE TABLE atable (
  SID int,
  Sdate datetime,
  Profit money,
  Units int
);
INSERT INTO atable (SID, Sdate, Profit, Units)
SELECT 1, '7/26/2010 9:15:00 AM' , -37.5, -1   UNION ALL    
SELECT 1, '7/26/2010 12:00:00 PM', -125 , -1   UNION ALL    
SELECT 1, '7/26/2010 12:45:01 PM', -12.5, -1   UNION ALL    
SELECT 1, '7/26/2010 12:45:02 PM', 0    ,  0   UNION ALL     
SELECT 1, '7/26/2010 12:45:03 PM', -75  ,  1   UNION ALL     
SELECT 1, '7/26/2010 2:00:01 PM' , -12.5,  1   UNION ALL     
SELECT 1, '7/26/2010 2:00:02 PM' , 0    ,  0   UNION ALL     
SELECT 1, '7/26/2010 2:00:03 PM' , -125 , -1   UNION ALL    
SELECT 1, '7/26/2010 2:15:00 PM' , -50  , -1   UNION ALL
SELECT 1, '7/27/2010 9:15:00 AM' , 25   , -1   UNION ALL    
SELECT 1, '7/27/2010 12:00:00 PM', 196  , -1   UNION ALL    
SELECT 1, '7/27/2010 2:15:00 PM' , -12.5, -1   UNION ALL
SELECT 1, '7/28/2010 9:15:00 AM' , 425  , -1   UNION ALL    
SELECT 1, '7/28/2010 12:00:00 PM', -125 , -1   UNION ALL    
SELECT 1, '7/28/2010 2:15:00 PM' , -12.5, -1   UNION ALL
SELECT 1, '7/29/2010 9:15:00 AM' , -37.5, -1   UNION ALL    
SELECT 1, '7/29/2010 12:00:00 PM', -90  , -1   UNION ALL    
SELECT 1, '7/29/2010 12:45:01 PM', -12.5, -1   UNION ALL    
SELECT 1, '7/29/2010 12:45:02 PM', 0    ,  0   UNION ALL    
SELECT 1, '7/29/2010 12:45:03 PM', -75  ,  1   UNION ALL    
SELECT 1, '7/29/2010 2:15:00 PM' , 23   ,  1;

Запрос:

WITH ranges AS (
  SELECT
    t.SID,
    t.Sdate,
    t.Units,
    SdateStart = MAX(t0.Sdate)
  FROM atable t
    INNER JOIN atable t0
       ON t0.SID = t.SID AND t0.Sdate < t.Sdate
      AND t0.Profit = 0 AND t0.Units = 0
  WHERE DATEPART(HH, t.Sdate) = 14
    AND DATEPART(MI, t.Sdate) = 15
  GROUP BY
    t.SID,
    t.Sdate,
    t.Units
)
SElECT
  r.SID,
  r.Sdate,
  Profit = SUM(t.Profit),
  r.Units
FROM ranges r
  INNER JOIN atable t ON t.SID = r.SID
    AND t.Sdate BETWEEN r.SdateStart AND r.Sdate
GROUP BY
  r.SID,
  r.Sdate,
  r.Units;

Выход:

SID         Sdate                   Profit                Units
----------- ----------------------- --------------------- -----------
1           2010-07-26 14:15:00.000 -175.00               -1
1           2010-07-27 14:15:00.000 33.50                 -1
1           2010-07-28 14:15:00.000 321.00                -1
1           2010-07-29 14:15:00.000 -52.00                1
1 голос
/ 26 июня 2011

У меня нет доступа к базе данных, чтобы проверить это.Но заполните табличную переменную @t и попробуйте это.

declare @t table (SID int, Sdate datetime, profit decimal(9,1), units int)

<populate it>

Я предположил, что вам нужен список для каждого SID.Я неправильно понял это.Я хотел бы изменить свой ответ на это.

select SID, Sdata, (select sum(Profit) from @t where Sdate between s.start and s.Sdate and S.SID = SID) profit, Units from 
(select SID, Sdata, (select max(Sdata) from @t where profit = 0 and unit = 0 and Sdata < t.Sdate and SID = t.SID) start from @t t 
where DATEPART(MINUTE, t.Sdata) =15 AND DATEPART(HOUR, t.Sdata) = 14 AND DATEPART(SECOND, t.Sdata) = 0 ) s
ORDER BY SID, Sdate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...