首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多个表返回具有最大日期的行

从多个表返回具有最大日期的行
EN

Stack Overflow用户
提问于 2019-04-03 21:59:58
回答 1查看 44关注 0票数 0

我试图从产品序列号上的最后一个交易日期中提取信息,而不管最后一个位置。销售、制造和库存交易都位于不同的表中。

我想我已经用嵌套的CASE语句缩小了列的范围,但是现在我需要返回最近的行,“序列号”是唯一的值。

代码语言:javascript
复制
[IV00101].[ITEMDESC] AS 'Item Description',
[IV00200].[SERLNMBR] AS 'Serial Number',
[IV00200].[LOCNCODE] AS 'Location Code',  
    CASE ISNULL(COALESCE([SOP30200].[CUSTNAME],[SOP10100].[CUSTNAME]),'')
    WHEN '' THEN CASE ISNULL([BM30400].[DATERECD],'')
        WHEN '' THEN CASE
            WHEN [IV30400].[IVDOCTYP] = 1 THEN 'Adjustment'
            WHEN [IV30400].[IVDOCTYP] = 2 THEN 'Variance'
            WHEN [IV30400].[IVDOCTYP] = 3 THEN 'Transfer'
            ELSE 'Other'
            END
        ELSE 'Assembly'
        END
    ELSE CASE
        WHEN [SOP30200].[SOPNUMBE] LIKE 'RTN%' THEN 'Return'
        ELSE 'Sale'
        END
    END AS 'Transaction Type',
COALESCE([SOP30200].[DOCDATE], [BM30400].[DATERECD],[IV30200].[DOCDATE]) AS 'Last Transaction Date',
[SOP10201].[SOPNUMBE] AS 'Document Number',
COALESCE([SOP30200].[CUSTNAME],[SOP10100].[CUSTNAME]) AS 'Bill To' ,
[SOP10106].[USERDEF2] AS 'End Client' from [IV00200]
 inner join [IV00101] on [IV00200].[ITEMNMBR] = [IV00101].[ITEMNMBR]
 left join [IV30400] on [IV00200].[SERLNMBR] = [IV30400].[SERLTNUM]
 left join [SOP10201] on [IV00200].[SERLNMBR] = [SOP10201].[SERLTNUM]
 left join [SOP30200] on [SOP10201].[SOPNUMBE] = [SOP30200].[SOPNUMBE]
 left join [IV30200] on [IV30400].[DOCNUMBR] = [IV30200].[DOCNUMBR]
 left join [BM30400] on [IV00200].[SERLNMBR] = [BM30400].[SERLTNUM]
 left join [SOP10106] on [SOP10201].[SOPNUMBE] = [SOP10106].[SOPNUMBE]
 left join [SOP10100] on [SOP10201].[SOPNUMBE] = [SOP10100].[SOPNUMBE]

因为我所有的左加入,这就是我要得到的:

代码语言:javascript
复制
Item A  Product Info    123456789   SITEID1 Adjustment  10/31/2018  120696  Customer A
Item A  Product Info    123456789   SITEID2 Transfer    11/20/2018  120696  Customer A
Item A  Product Info    123456789   SITEID2 Sale    3/25/2019   120696  Customer A

我如何分组我的行,使我只返回这个?

Item A Product Info 123456789 SITEID2 Sale 3/25/2019 120696 Customer A

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-03 22:52:44

一个公共表表达式(CTE)加上窗口函数ROW_NUMBER应该可以工作。

  1. 将查询放入CTE中
  2. 添加ROW_NUMBER
  3. 通过RowNum =1过滤CTE结果(以获得最新的事务)
代码语言:javascript
复制
WITH [SomeGoodName_CTE]
     AS (SELECT [IV00101].[ITEMDESC] AS 'Item Description'
              , [IV00200].[SERLNMBR] AS 'Serial Number'
              , [IV00200].[LOCNCODE] AS 'Location Code'
              , CASE ISNULL(COALESCE([SOP30200].[CUSTNAME], [SOP10100].[CUSTNAME]), '')
                  WHEN '' THEN CASE ISNULL([BM30400].[DATERECD], '')
                                 WHEN '' THEN CASE
                                                WHEN [IV30400].[IVDOCTYP] = 1 THEN 'Adjustment'
                                                WHEN [IV30400].[IVDOCTYP] = 2 THEN 'Variance'
                                                WHEN [IV30400].[IVDOCTYP] = 3 THEN 'Transfer'
                                                ELSE 'Other'
                                              END
                                 ELSE 'Assembly'
                               END
                  ELSE CASE
                         WHEN [SOP30200].[SOPNUMBE] LIKE 'RTN%' THEN 'Return'
                         ELSE 'Sale'
                       END
                END AS 'Transaction Type'
              , COALESCE([SOP30200].[DOCDATE], [BM30400].[DATERECD], [IV30200].[DOCDATE]) AS 'Last Transaction Date'
              , [SOP10201].[SOPNUMBE] AS 'Document Number'
              , COALESCE([SOP30200].[CUSTNAME], [SOP10100].[CUSTNAME]) AS 'Bill To'
              , [SOP10106].[USERDEF2] AS 'End Client'
              , [RowNum] = ROW_NUMBER() OVER(PARTITION BY [IV00200].[ITEMNMBR] ORDER BY COALESCE([SOP30200].[DOCDATE], [BM30400].[DATERECD], [IV30200].[DOCDATE]) DESC)
         FROM [IV00200]
              INNER JOIN [IV00101]
                ON [IV00200].[ITEMNMBR] = [IV00101].[ITEMNMBR]
              LEFT JOIN [IV30400]
                ON [IV00200].[SERLNMBR] = [IV30400].[SERLTNUM]
              LEFT JOIN [SOP10201]
                ON [IV00200].[SERLNMBR] = [SOP10201].[SERLTNUM]
              LEFT JOIN [SOP30200]
                ON [SOP10201].[SOPNUMBE] = [SOP30200].[SOPNUMBE]
              LEFT JOIN [IV30200]
                ON [IV30400].[DOCNUMBR] = [IV30200].[DOCNUMBR]
              LEFT JOIN [BM30400]
                ON [IV00200].[SERLNMBR] = [BM30400].[SERLTNUM]
              LEFT JOIN [SOP10106]
                ON [SOP10201].[SOPNUMBE] = [SOP10106].[SOPNUMBE]
              LEFT JOIN [SOP10100]
                ON [SOP10201].[SOPNUMBE] = [SOP10100].[SOPNUMBE])
     SELECT *
     FROM [SomeGoodName_CTE]
     WHERE [RowNum] = 1;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55504969

复制
相关文章

相似问题

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