将最大值和大小写添加到数据中?

Adding max and case to data?

我想在这里向我的代码添加一些东西并修改它 table,但我在 SQL 方面有点新手,我正在努力使精神飞跃,找出如何连接一些东西。

  1. 我正在尝试按作业添加分区以获得第 1、2、3、4 行...(因此作业 21980 将有 3 行)

  2. 然后我想按 JOB 添加 MAX of ROW NO(所以基本上我想显示每个作业的最高行。所以作业 21980 有 3 行,我只想显示值3)

  3. 然后我想说:当行号不是最大行号时,我希望行中的数据对于列为零:PO$$,Wip Total,per pc、标准成本、DIFF、利润百分比

当前 SQL 生成此数据:

SELECT  [Job #],
        ,[Date]
        ,[Variance Amt]
        ,[Job QTY] 
        ,[OpenQty] 
        ,[Part #] 
        ,[Material] 
        ,[PCS #] 
        ,[Matrl$$] 
        ,[Date Last Issue] 
        ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders] 
        ,[PO$$] 
        ,[Date Last Rcvd] 
        ,[Wip Total] 
        ,[per pc] 
        ,[Standard Cost] 
        ,[DIFF] 
        ,[% of Profit] 
        FROM [VarianceView] 
        Order By [Job #]

我知道如何开始第 1 步和第 2 步,但我只知道这些。

ROW_NUMBER() OVER(PARTITION BY [Job #]
ORDER BY [Job #] DESC) AS 'RN'
,count(*) over(partition by [Job #]) as maxrn

Some Sample Data

在此先感谢大家的帮助!

我认为您的拼图中缺少的部分是 Common Table Expression。您不能引用窗口函数,除非它首先出现在常见的 table 表达式或 sub-query 中。以下是我将如何解决您的问题。您还希望 row_number() 函数中的 order by 子句包含您希望的工作记录排序方式。例如,您可能希望使用最新的 [Date Last Issue] 作为分区中的最后一条记录或第一条记录来评估它们。

如果您只想显示排名靠前的 Job # 记录,则需要添加另一个 row_number() 函数(例如“RowNumberDesc”),但 [Job #] 是降序排列的。然后你可以在外部查询中添加一个 where 子句来限制 RowNumberDesc = 1.

with cte as (
    select
        [Job #]
        ,[Date]
        ,[Variance Amt]
        ,[Job QTY] 
        ,[OpenQty] 
        ,[Part #] 
        ,[Material] 
        ,[PCS #] 
        ,[Matrl$$] 
        ,[Date Last Issue] 
        ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders] 
        ,[PO$$] 
        ,[Date Last Rcvd] 
        ,[Wip Total] 
        ,[per pc] 
        ,[Standard Cost] 
        ,[DIFF] 
        ,[% of Profit] 
        ,ROW_NUMBER() OVER(PARTITION BY [Job #] ORDER BY [Date Last Issue]) AS 'RN'
        ,count(*) over(partition by [Job #]) as maxrn
      FROM [VarianceView] 
)

SELECT  [Job #]
        ,[Date]
        ,[Variance Amt]
        ,[Job QTY] 
        ,[OpenQty] 
        ,[Part #] 
        ,[Material] 
        ,[PCS #] 
        ,[Matrl$$] 
        ,[Date Last Issue] 
        ,case when substring([PurchaseOrders],len([PurchaseOrders]),1) = '|' then substring([PurchaseOrders],1,len([PurchaseOrders])-1) else [PurchaseOrders] end [PurchaseOrders] 
        ,case when rn <> maxrn then 0 else [PO$$] end as [PO$$]
        ,[Date Last Rcvd] 
        ,case when rn <> maxrn then 0 else [Wip Total]      end as [Wip Total] 
        ,case when rn <> maxrn then 0 else [per pc]         end as [per pc] 
        ,case when rn <> maxrn then 0 else [Standard Cost]  end as [Standard Cost]
        ,case when rn <> maxrn then 0 else [DIFF]           end as [DIFF] 
        ,case when rn <> maxrn then 0 else [% of Profit]    end as [% of Profit] 
        ,rn as [ROW NO by JOB]
        ,maxrn as [MAX of ROW NO by JOB]
        FROM cte
        Order By [Job #]