【问题标题】:How to dynamically change a row?如何动态改变一行?
【发布时间】:2019-08-16 02:57:30
【问题描述】:

我正在尝试找到一种方法来动态更改最早日期字段的日期,所以如果 TotalShipped = TotalOrdered 那么我想取最早的日期这两个字段不相等。

这是当前数据的示例

CREATE TABLE mytable (
  fsono INT
  , NAME VARCHAR(30)    
  , TS int
  , [TO] int   
  , [Date] date  
);

INSERT INTO mytable (fsono, NAME, TS, [TO], [Date])
  VALUES
    (1,'039069',1,1,'2019-3-19')
    , (2,'039069',1,1,'2019-3-19')
    , (3,'039069',1,0,'2019-3-20')
    , (4,'039069',1,0,'2019-3-21');

SELECT 
  sorels.fsono,
  sorels.finumber,
  sorels.frelease,
  fshipbook+fshipbuy+fshipmake as totalshipped,
  fjoqty + fbook + fbqty as totalordered,
  sorels.fduedate
FROM m2mdata35.dbo.sorels   
INNER JOIN somast on sorels.fsono=somast.fsono   
INNER JOIN soitem on sorels.fsono=soitem.fsono AND sorels.finumber=soitem.finumber   
LEFT JOIN inmastx on soitem.fpartno=inmastx.fpartno and soitem.fpartrev=inmastx.frev  
LEFT JOIN jomast on sorels.fstatus=jomast.fjobno 
LEFT JOIN slcdpmx on somast.fcustno=slcdpmx.fcustno  
LEFT JOIN syphon ON somast.fcontact=syphon.fcontact AND somast.fcustno=syphon.fcsourceid 
WHERE LEFT(somast.fstatus,1)<>'C' and fsocoord<>'IFP' and fsocoord<>'711' 
and somast.fsono='039069' 
Order By sorels.fsono, sorels.fduedate, sorels.finumber, sorels.frelease

这就是我想要的结果

CREATE TABLE myresults (
  fsono INT 
  , NAME VARCHAR(30)
  , TS int  
  , [TO] int   
  , [Date] date  
  , Earliest_Date date 
);

INSERT INTO myresults (fsono, NAME, TS, [TO], [Date], Earliest_Date)
  VALUES
    (1,'039069',1,1,'2019-3-19','2019-3-20')
    , (2,'039069',1,1,'2019-3-19','2019-3-20')
    , (3,'039069',1,0,'2019-3-20','2019-3-20')
    , (4,'039069',1,0,'2019-3-21','2019-3-20');

【问题讨论】:

  • MyTable 与该查询有什么关系?此外,您的 where 子句中有围绕列的函数。这会使您的查询成为非 SARGable,并且没有任何索引可以帮助您。
  • @SeanLange 只是一些示例数据,以便人们可以复制我正在尝试做的事情。
  • 好的,但是样本数据完全脱离了上下文,至少对我来说,它在这里的关系是没有意义的。您真正要发布的是与查询相关的一些示例数据。

标签: sql-server tsql sql-server-2008-r2


【解决方案1】:

这是一种方法。

Select  AllData.*,
        earliest.mismatch
from    #mytable    AllData
    left join
        (Select NAME, 
                min(date) mismatch
        from    #mytable
        where   [ts] <> [TO]
        group by
                NAME) earliest         on AllData.Name = earliest.Name

【讨论】:

    【解决方案2】:

    我最终使用了一个公用表表达式并加入了该表。

    ;with cte1 as (
    SELECT Distinct 
    sorels.fsono,
    min(sorels.fduedate ) Over(Partition by sorels.fsono, Case when fshipbook+fshipbuy+fshipmake <> sorels.fjoqty + sorels.fbook + sorels.fbqty then 1 else 0 end ) as EarliestDate 
    -----------
    
    FROM m2mdata35.dbo.sorels     
    INNER JOIN somast on sorels.fsono=somast.fsono  
    
    WHERE LEFT(somast.fstatus,1)<>'C' 
    and fsocoord<>'IFP' and fsocoord<>'711' 
    and fshipbook+fshipbuy+fshipmake <> sorels.fjoqty + sorels.fbook + sorels.fbqty
    )
    
    select sorels.fsono, sorels.finumber, sorels.frelease,
    Case when fshipbook+fshipbuy+fshipmake <> sorels.fjoqty + sorels.fbook + sorels.fbqty then 'T' else 'F' end as BackOrd,
    sorels.fduedate, cte1.EarliestDate, 
    --/*
    sorels.fjoqty ,
    sorels.fbqty,
    fshipbook+fshipbuy+fshipmake as totalshipped,
    sorels.fjoqty + sorels.fbook + sorels.fbqty as totalordered,
    inwork.fcpro_id,
    inwork.fdept,
    soitem.fsource as 'soitem.fsource',
    sorels.funetprice,
    sorels.fshptoaddr as 'sorels.fshptoaddr',
    somast.fshptoaddr as 'somast.fshptoaddr',
    syaddr.fccompany,
    sorels.fstatus ,
    jomast.fjobno,
    jomast.fstatus AS 'jomast.fstatus', 
    soitem.fenumber,
    soitem.fquantity,
    sorels.forderqty,   
    somast.fcustno,
    soitem.fac,
    soitem.fpartno,
    soitem.fpartrev,
    incros.fcrosspart,
    somast.fcompany,
    slcdpmx.fcusrchr1,
    left(somast.fcfname,1) as 'somast.fcfname',
    somast.fcontact,
    syphon.fctitle,
    soitem.fgroup as 'soitem.fgroup',
    soitem.fprodcl as 'soitem.fprodcl',
    soitem.manualplan,
    --inmast.fsource as 'soitem.fsource',
    inmast.fgroup AS 'inmast.fgroup',
    inmast.fbuyer as 'inmast.fbuyer' ,
    inmast.fprodcl as 'inmast.fpodcl',
    inmast.fnusrcur1 as 'inmast.fnusrcur1' ,
    inmast.fproqty as 'inmast.fproqty',
    inmast.fbook as 'inmast.fbook',
    inmast.fonhand 'inmast.fonhand',
    inmast.frevdt 'inmast.frevdt',   
    somast.fshipvia,
    cspopup.fcpoptext,
    somast.fstatus AS 'somast.fstatus',
    somast.fsocoord,
    somast.fordername,
    somast.fcustpono,
    somast.fcusrchr1 AS 'somast.fcusrchr1',
    somast.fcusrchr2,
    somast.fcusrchr3,
    somast.forderdate,
    sorels.fpostatus,   
    sorels.fshipbook,
    sorels.fshipbuy,
    sorels.fshipmake,
    sorels.fshpbefdue,
    sorels.fsplitshp,
    soitem.fshipitem,
    soitem.fmultiple,
    sorels.fstatus as 'sorels.fstatus',
    sorels.fshipbook + sorels.fshipbuy + sorels.fshipmake AS 'qtyshipped',
    sorels.forderqty - sorels.fshipbook + sorels.fshipbuy + sorels.fshipmake AS 'qtyship', 
    jodrtg.fnqty_comp - sorels.fshipbook + sorels.fshipbuy + sorels.fshipmake - jodrtg.fnqty_move AS 'availtoship'
    --*/
    
    from sorels 
    LEFT JOIN cte1 on sorels.fsono=cte1.fsono 
    INNER JOIN soitem on sorels.fsono+sorels.finumber=soitem.fsono+soitem.finumber  
    INNER JOIN somast on sorels.fsono=somast.fsono  
    
    --/*
    LEFT JOIN cspopup ON 'SHIPVIA             '+somast.fshipvia=cspopup.fcpopkey+cspopup.fcpopval
    LEFT JOIN inmast on soitem.fpartno+soitem.fpartrev=inmast.fpartno+inmast.frev 
    LEFT JOIN incros on inmast.fpartno+inmast.frev=incros.fpartno+incros.fcpartrev
    LEFT JOIN jomast on sorels.fstatus=jomast.fjobno 
    LEFT JOIN joitem on jomast.fjobno=joitem.fjobno
    LEFT JOIN jodrtg on jomast.fjobno=jodrtg.fjobno 
    LEFT JOIN inwork on jodrtg.fpro_id=inwork.fcpro_id
    LEFT JOIN slcdpmx on somast.fcustno=slcdpmx.fcustno  
    LEFT JOIN syphon ON somast.fcontact=syphon.fcontact AND somast.fcustno=syphon.fcsourceid 
    LEFT JOIN syaddr ON 'SLCDPM    '+somast.fcustno+'S'+sorels.fshptoaddr=syaddr.fcalias+syaddr.fcaliaskey+syaddr.fcaddrtype+syaddr.fcaddrkey 
    --*/
    
    WHERE LEFT(somast.fstatus,1)<>'C' 
    and fsocoord<>'IFP' and fsocoord<>'711' 
    
    Order by cte1.EarliestDate, sorels.fsono, BackOrd, sorels.finumber, sorels.frelease
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2017-02-05
      • 1970-01-01
      相关资源
      最近更新 更多