Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以在没有游标和循环的情况下实现任务—仅通过纯SQL实现?_Sql - Fatal编程技术网

是否可以在没有游标和循环的情况下实现任务—仅通过纯SQL实现?

是否可以在没有游标和循环的情况下实现任务—仅通过纯SQL实现?,sql,Sql,请帮忙!我得到了下面的mssql表 CREATE TABLE Deals(id INT PRIMARY KEY CLUSTERED, date_deal DATETIME, client VARCHAR(20), product VARCHAR(20), qty DECIMAL(19,2), price DECIMAL(19,7)) INSERT dbo.Deals (id, date_deal, client, product, qty, price) VALUES (1, '2

请帮忙!我得到了下面的mssql表

CREATE TABLE Deals(id INT PRIMARY KEY CLUSTERED, 
date_deal DATETIME, 
client VARCHAR(20), 
product VARCHAR(20), 
qty DECIMAL(19,2), 
price DECIMAL(19,7)) 

INSERT dbo.Deals (id, date_deal, client, product, qty, price)
VALUES (1, '20190101', 'ivanov', 'LKOH', 10, 2000),
       (2, '20190102', 'ivanov', 'LKOH', 10, 2100), 
       (3, '20190102', 'ivanov', 'LKOH', 15, 2150), 
       (4, '20190103', 'ivanov', 'LKOH', -20, 2200), 
       (5, '20190104', 'ivanov', 'LKOH', -20, 2300),

       (6, '20190102', 'ivanov', 'GAZP', 100, 100),
       (7, '20190103', 'ivanov', 'GAZP', 200, 110),
       (8, '20190104', 'ivanov', 'GAZP', -50, 100),
       (9, '20190105', 'ivanov', 'GAZP', -50, 90),
       (10, '20190106', 'ivanov', 'GAZP', -200, 120),
       (11, '20190107', 'ivanov', 'GAZP', 150, 110),
       (12, '20190108', 'ivanov', 'GAZP', -100, 115),

       (13, '20190101', 'petrov', 'LKOH', 20, 2000),
       (14, '20190102', 'petrov', 'LKOH', 20, 2100),
       (15, '20190103', 'petrov', 'LKOH', -30, 2200),
       (16, '20190104', 'petrov', 'LKOH', -5, 2300),
       (17, '20190104', 'petrov', 'LKOH', -2, 2350),
       (18, '20190105', 'petrov', 'LKOH', -3, 2400),
       (19, '20190106', 'petrov', 'LKOH', 5, 2000)--,
还有这样的SQL查询

 SELECT
   ids, product, client,(ABS(qtys) * prices - (CASE WHEN (sum_qty - qty) > 0 THEN sum_profit/sum_qty ELSE price END) *  ABS(qtys)) profit
    FROM 
     (SELECT id ids, client clients, product products, qty qtys, price prices, 
             (SELECT SUM(qty) sum_buy FROM dbo.Deals d2 WHERE (id < d.id) AND (client = d.client) AND (product = d.product)) qty_buy
          FROM dbo.Deals d 
          WHERE (qty < 0)) s  
    
    INNER JOIN
    
      (SELECT id, qty, price, product, client, SUM(qty) OVER (PARTITION BY product, client ORDER BY id) sum_qty,
              SUM(qty * price) OVER (PARTITION BY product, client ORDER BY id) sum_profit
       FROM dbo.Deals) bs 

    ON bs.id = s.ids - 1
    ORDER BY s.ids
id=12: 只应考虑购买id=11,因为之前购买的所有物品都已售出,且未受本次交易的影响,即利润=100*115-100*110=500

     (13, '20190101', 'petrov', 'LKOH', 20, 2000),
       (14, '20190102', 'petrov', 'LKOH', 20, 2100),
       (15, '20190103', 'petrov', 'LKOH', -30, 2200), profit = 30 * 2200 - (20 * 2000 + 20 * 2100) / 40 * 30 = 4500
       (16, '20190104', 'petrov', 'LKOH', -5, 2300),



  id = 16:
    my query: profit = 5*2300 - (20*2000 + 20*2100 - 30*2200) / 10 * 5 = 3500
    but it should be: profit = 5 * 2300 - (10 * 2100) / 10 * 5 = 1000
   

    (17, '20190104', 'petrov', 'LKOH', -2, 2350),
       (18, '20190105', 'petrov', 'LKOH', -3, 2400),
       (19, '20190106', 'petrov', 'LKOH', 5, 2000)
有没有可能在没有条件语句和循环的情况下完全使用T-SQL来实现这一点,请告诉我,这是非常必要的

     (13, '20190101', 'petrov', 'LKOH', 20, 2000),
       (14, '20190102', 'petrov', 'LKOH', 20, 2100),
       (15, '20190103', 'petrov', 'LKOH', -30, 2200), profit = 30 * 2200 - (20 * 2000 + 20 * 2100) / 40 * 30 = 4500
       (16, '20190104', 'petrov', 'LKOH', -5, 2300),



  id = 16:
    my query: profit = 5*2300 - (20*2000 + 20*2100 - 30*2200) / 10 * 5 = 3500
    but it should be: profit = 5 * 2300 - (10 * 2100) / 10 * 5 = 1000
   

    (17, '20190104', 'petrov', 'LKOH', -2, 2350),
       (18, '20190105', 'petrov', 'LKOH', -3, 2400),
       (19, '20190106', 'petrov', 'LKOH', 5, 2000)