是否可以在没有游标和循环的情况下实现任务—仅通过纯SQL实现?
请帮忙!我得到了下面的mssql表是否可以在没有游标和循环的情况下实现任务—仅通过纯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
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)