我正在处理一个查询,该查询比较两个表,并在第一个表中返回最佳值。
我所有的东西都在SQL Fiddle上
但出于某些原因,它在出价和报价列中返回空值,不应该对上述两个表运行SQL查询,结果应该如下
╔════╦════════╦═════════════╦═══════╦══════╦═══════╦═════════╗
║ Id ║ Market ║ Term ║ BidCP ║ Bid ║ Offer ║ OfferCP ║
╠════╬════════╬═════════════╬═══════╬══════╬═══════╬═════════╣
║ 14 ║ abc ║ Q4 14/Q1 15 ║ begrt ║ -425 ║ NULL ║ vf ║
║ 1 ║ C1 ║ Sep14/Oct14 ║ punt ║ -50 ║ NULL ║ vgc ║
╚════╩════════╩═════════════╩═══════╩══════╩═══════╩═════════╝上述结果可解释为:
对于第一个表中的
Product C1,没有包含术语Sep14/Oct14的行,因此返回出价值最高、出价最低的行。同样,对于产品abc和术语Q4 14/Q1 15。但是对于产品abc和第一个表中的术语Sep14/Oct14,与第二个表相同的产品和术语相比,第二个表具有更好的出价和报价值,因此在结果中不返回行。
有更好的方法吗?
发布于 2014-08-12 14:27:48
在我看来,您的查询和语法被>、<、MAX()和MIN()函数弄糊涂了。据我所知,你是在处理负数,并期望得到最大的绝对值: so -500是一个比-400更大的出价。然而,告诉SQL处理MAX和MIN是在寻找列的实际值,从数学角度来说-400大于-500。
尝试将MAX()替换为MIN(),而另一种情况则相反。或者,尝试使用ABS()函数获取数据的绝对值(例如,MAX(ABS(Bid)) )。
发布于 2014-08-12 14:29:04
好吧,我不明白你想用这个实现什么,但我看到了一些问题:
我把它放到了您的查询的一个稍微修改的版本中,它可能会帮助您分辨出哪里出了问题?
DECLARE @InferredBids TABLE (Market VARCHAR(10), Term VARCHAR(20), BidCP VARCHAR(10), Bid FLOAT, Offer FLOAT, OfferCP VARCHAR(10));
INSERT INTO @InferredBids VALUES('C1', 'Sep14/Oct14', 'Nothing', -60, -40, '');
INSERT INTO @InferredBids VALUES('C1', 'Sep14/Oct14', 'punt', -50, NULL, 'vgc');
INSERT INTO @InferredBids VALUES('abc', 'Sep14/Oct14', 'disc', -390, -285, 'fvfvf');
INSERT INTO @InferredBids VALUES('abc', 'Sep14/Oct14', 'vgc', -415, -185, 'vfvfv');
INSERT INTO @InferredBids VALUES('abc', 'Q4 14/Q1 15', 'begrt', -425, NULL , 'vf');
DECLARE @CanadianCrudes TABLE (Product VARCHAR(10), Term VARCHAR(20), BidCP VARCHAR(10), Bid FLOAT, Offer FLOAT, OfferCP VARCHAR(10));
INSERT INTO @CanadianCrudes VALUES('C1','Sep14', 'dddddddd', -975, NULL,'xoom');
INSERT INTO @CanadianCrudes VALUES('C1','Sep14', 'efrt', -985, NULL, NULL);
INSERT INTO @CanadianCrudes VALUES('C1', 'Sep14', 'BPl', NULL, NULL, 'jjjj');
INSERT INTO @CanadianCrudes VALUES('abc', 'Sep14/Oct14', 'CVXvg', -350 , -300, 'Shl');
WITH t1 AS (
SELECT
Market,
Term,
MAX(Bid) AS MaxBid,
MIN(Offer) AS MinOffer
FROM
@InferredBids
GROUP BY
Market,
Term),
t2 AS (
SELECT
Product,
Term,
MAX(Bid) AS Bid,
MIN(Offer) AS Offer
FROM
@CanadianCrudes
GROUP BY
Product,
Term)
SELECT
t1.Market,
t1.Term,
ib.BidCP,
ib.Bid AS InferredBid,
cc.Bid AS CrudeBid,
CASE WHEN ib.Bid >= ISNULL(cc.Bid, 0) THEN t1.MaxBid ELSE NULL END AS CalculatedBid,
t1.MaxBid,
ib.Offer AS InferredOffer,
cc.Offer AS CrudeOffer,
CASE WHEN ib.Offer <= ISNULL(cc.Offer, 0) THEN t1.MinOffer ELSE NULL END AS CalculatedOffer,
ib.OfferCP
FROM
t1
LEFT JOIN t2 ON t1.Market = t2.Product
LEFT JOIN @InferredBids ib ON ib.Market = t1.Market AND ib.Term = t1.Term AND ib.Bid = t1.MaxBid --AND ib.offer = t1.minoffer
LEFT JOIN @CanadianCrudes cc ON cc.Product = t2.Product AND cc.Term = t2.Term AND cc.Bid = t2.Bid; --AND cc.offer = t2.offer如果你运行这个,你会得到这样的东西:
Market Term BidCP InferredBid CrudeBid CalculatedBid MaxBid InferredOffer CrudeOffer CalculatedOffer OfferCP
abc Q4 14/Q1 15 begrt -425 -350 NULL -425 NULL -300 NULL vf
abc Sep14/Oct14 disc -390 -350 NULL -390 -285 -300 NULL fvfvf
C1 Sep14/Oct14 punt -50 -975 -50 -50 NULL NULL NULL vgchttps://stackoverflow.com/questions/25266190
复制相似问题