【问题标题】:Group rows but choose to show value of one field in group?分组行但选择显示组中一个字段的值?
【发布时间】:2016-06-23 11:40:36
【问题描述】:

我有一个请求,但我不确定我是否可以同意。希望是按某些字段对行进行分组,但随后还会显示一个项目描述字段,该字段会分解该组,我不能保证在项目描述字段上使用 min() 或 max() 会导致在所有项目中显示所需的描述案例。

请注意,在这段代码中,我已将项目描述注释掉,这给出了他们想要的行数和分组。

SELECT 
    --L.ITEMDESC,
    SUM(L.UNITPRCE) AS Rate,
    SUM(L.XTNDPRCE) AS Price,
    L.QUANTITY AS Quantity,
    RTRIM(L.UOFM) AS UOFM, 
    C.COMMENT_1, 
    C.COMMENT_2, 
    C.COMMENT_3
FROM 
    SOP10200 L, SOP10202 C
WHERE 
    L.SOPNUMBE = C.SOPNUMBE
    AND L.SOPTYPE = C.SOPTYPE
    AND L.LNITMSEQ = C.LNITMSEQ
    AND L.SOPNUMBE = '00644680'
GROUP BY 
    C.COMMENT_1, C.COMMENT_2, C.COMMENT_3, L.QUANTITY, L.UOFM--, L.ITEMDESC

例如交易的结果:

Rate    Price   Quantity    UOFM    COMMENT 1               COMMENT 2   COMMENT 3
0.37891 63.56   167.72421   THERMS  CESeq: 52593^Act^TARGET 10/13/2015  10/31/2015
0.34254 30.23   88.27579    THERMS  CESeq: 52593^Act^TARGET 11/1/2015   11/10/2015

如果我出于解释目的包含项目描述,结果如下:

ITEMDESC                Rate    Price   Quantity    UOFM    COMMENT 1               COMMENT 2   COMMENT 3
Gas on the PG&E System  0.34691 58.19   167.72421   THERMS  CESeq: 52593^Act^TARGET 10/13/2015  10/31/2015
PGE SPCC ADDER          0.03200 5.37    167.72421   THERMS  CESeq: 52593^Act^TARGET 10/13/2015  10/31/2015
Gas on the PG&E System  0.31054 27.41   88.27579    THERMS  CESeq: 52593^Act^TARGET 11/1/2015   11/10/2015
PGE SPCC ADDER          0.03200 2.82    88.27579    THERMS  CESeq: 52593^Act^TARGET 11/1/2015   11/10/2015

在这个数据的特定场景中,他们说他们希望看到Gas on the PG&E System 作为描述,但我不能只使用 min() 或 max() 来解决这个事务的场景,因为这可能不适合其他人。

因此,这张图片在其中一个表格中显示,我可以使用不等于零的单位成本作为选择要使用哪一行描述的规则。但我正在努力思考如何在代码中实现它。我想向客户建议。如何利用 Unit Cost 0 来选择显示哪个项目描述?

【问题讨论】:

  • 如果您不知道选择其中一个的依据,我们帮不了您。
  • 也许我可以在最后一个问题中更具体一些。我会更新它以专门询问有关使用单位成本的问题。
  • 但是你还是有问题。您无法确定是否会有任何 Unit Cost 0 或超过一个
  • 点了。我必须与客户确认所需行的描述始终具有单位成本,并且不显示描述的所需行的单位成本为零。抽查表明这应该是真的,但你是对的,我现在还不能 100% 确定。感谢您帮助我思考这个问题。

标签: tsql


【解决方案1】:

这是大纲

select * from 
(
select a, b, c, unitcost 
     , sum(UNITPRCE) over (partition by a, b order by 1) as p1 
     , sum(XTNDPRCE) over (partition by a, b order by 1) as p2 
     , row_number()  over (partition by a, b order by unit unitcost) as rn 
) as tt 
where tt.rn = 1

【讨论】:

    【解决方案2】:

    狗仔队的回答很好。另一种解决方案是执行以下操作:

    SELECT 
        Max(case when L.UNITPRCE <> 0 then L.ITEMDESC else null end) AS ITEMDESC,
        SUM(L.UNITPRCE) AS Rate,
        SUM(L.XTNDPRCE) AS Price,
        L.QUANTITY AS Quantity,
        RTRIM(L.UOFM) AS UOFM, 
        C.COMMENT_1, 
        C.COMMENT_2, 
        C.COMMENT_3
    FROM 
        SOP10200 L, SOP10202 C
    WHERE 
        L.SOPNUMBE = C.SOPNUMBE
        AND L.SOPTYPE = C.SOPTYPE
        AND L.LNITMSEQ = C.LNITMSEQ
        AND L.SOPNUMBE = '00644680'
    GROUP BY 
        C.COMMENT_1, C.COMMENT_2, C.COMMENT_3, L.QUANTITY, L.UOFM
    

    如果只有 FIRST_VALUEaggregate function instead of an analytic function 你可以使用它,但可惜我们被这些粗糙的解决方案所困。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 2020-05-27
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多