首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行多个联接以比较两个表时返回空值的查询

执行多个联接以比较两个表时返回空值的查询
EN

Stack Overflow用户
提问于 2014-08-12 13:56:46
回答 2查看 74关注 0票数 0

我正在处理一个查询,该查询比较两个表,并在第一个表中返回最佳值。

我所有的东西都在SQL Fiddle

但出于某些原因,它在出价和报价列中返回空值,不应该对上述两个表运行SQL查询,结果应该如下

代码语言:javascript
复制
╔════╦════════╦═════════════╦═══════╦══════╦═══════╦═════════╗
║ 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,与第二个表相同的产品和术语相比,第二个表具有更好的出价和报价值,因此在结果中不返回行。

有更好的方法吗?

EN

回答 2

Stack Overflow用户

发布于 2014-08-12 14:27:48

在我看来,您的查询和语法被>、<、MAX()MIN()函数弄糊涂了。据我所知,你是在处理负数,并期望得到最大的绝对值: so -500是一个比-400更大的出价。然而,告诉SQL处理MAX和MIN是在寻找列的实际值,从数学角度来说-400大于-500。

尝试将MAX()替换为MIN(),而另一种情况则相反。或者,尝试使用ABS()函数获取数据的绝对值(例如,MAX(ABS(Bid)) )。

票数 0
EN

Stack Overflow用户

发布于 2014-08-12 14:29:04

好吧,我不明白你想用这个实现什么,但我看到了一些问题:

  • 你正在整理一个最高出价/最低出价为每件“东西”,然后加入这些回到原来的表。但这是行不通的,除非单行有最高出价和最低出价;
  • 你在什么时候显示出价/报价的一些逻辑意味着你的输出中会有空档,所以你应该会看到它们;
  • 当您使用负值(和负值!!)时,您对值之间的比较似乎有些混乱。

我把它放到了您的查询的一个稍微修改的版本中,它可能会帮助您分辨出哪里出了问题?

代码语言:javascript
复制
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

如果你运行这个,你会得到这样的东西:

代码语言:javascript
复制
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        vgc
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25266190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档