首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用不同的P键值求和两个特定行。PostgreSQL

用不同的P键值求和两个特定行。PostgreSQL
EN

Stack Overflow用户
提问于 2017-04-25 13:13:11
回答 1查看 25关注 0票数 0

因此,我有一个返回下表的查询:

代码语言:javascript
复制
charvar | numeric | numeric           |   numeric  | text
 cargo  |   qtd   | valor_ust_servico |  total_ust | valor_servco

 name1  |   30    |   0.50  |  236.50 | US$ 20,132.02
 name2  |   96    |   0.50  |  236.50 | US$ 43,169.32
 name3  |   120   |   0.50  |  236.50 | US$ 12,791.11
 name4  |  7708   |   0.50  |  236.50 | US$ 142,041.64
 name5  |   469   |   0.50  |  236.50 | US$ 5,984.18

我需要把最后一张桌子上的name1和name3加起来。

我的代码如下

代码语言:javascript
复制
    with consulta as
(  
  SELECT
          cc.nomecategoriaservico,
          max(s.nomeservico) as nomeservico,
          min(vsc.valorServico) as valor_UST_Serviço,
          sum(vsc.valorservico) as total_UST,
          sum(vsc.valorServico*c.cotacaomoeda) as Valor_Serviço,
          count(s.nomeservico) as qtd,
          EXTRACT(MONTH FROM SS.DATAHORAFIM) AS MESSERVICO
        FROM solicitacaoservico ss
        INNER JOIN SERVICOCONTRATO SC ON SC.IDSERVICOCONTRATO = SS.IDSERVICOCONTRATO
        INNER JOIN VALORSERVICOCONTRATO VSC ON VSC.IDSERVICOCONTRATO = SC.IDSERVICOCONTRATO
        INNER JOIN CONTRATOS C ON C.IDCONTRATO = SC.IDCONTRATO
        INNER JOIN SERVICO S ON S.IDSERVICO = SC.IDSERVICO
        left JOIN CATEGORIASERVICO CC ON S.IDCATEGORIASERVICO = CC.IDCATEGORIASERVICO
        WHERE ss.datahorafim BETWEEN '2017-03-01 00:00:00' AND '2017-03-31 23:59:59.999'
        AND UPPER(SS.SITUACAO) = UPPER('FECHADA')
        GROUP BY CC.NOMECATEGORIASERVICO, EXTRACT(MONTH FROM SS.DATAHORAFIM)
), consolidado as
 (
     select
     0 as linha,
     nomecategoriaservico AS CARGO,
     qtd,
     valor_UST_Serviço,
     total_UST AS total_UST,
     'R$' || to_char(Valor_Serviço,'9G999G999D99') as Valor_Serviço
  FROM consulta
  UNION ALL
  SELECT
    1 as linha,
    'Total UST' as CARGO,
    sum(qtd) as qtde,
    round(sum(qtd*valor_UST_Serviço)/sum(qtd),2) valor_UST_Serviço,
    sum(total_UST) as total,
    'R$' || to_char(sum(Valor_Serviço),'9G999G999D99') as Valor_Serviço
  FROM consulta
), fim AS (
select
  CARGO,
  qtd,
  valor_UST_Serviço,
  total_UST,
  REPLACE(REPLACE(REPLACE(Valor_Serviço,'  ',' '),'  ',' '),'  ',' ') AS Valor_Serviço
from consolidado
order by linha,CARGO

到目前为止,我尝试过的每一件事都很接近,但并不完全正确。由于格式不同,我也得到了许多选角错误。

edit1。A但格式

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-25 13:19:54

CTE别名咨询:

代码语言:javascript
复制
  SELECT
          case when cc.nomecategoriaservico = 'name1' or name_col = 'name3' then 'name1or3' else cc.nomecategoriaservico end nomecategoriaservico,
          max(s.nomeservico) as nomeservico,
          min(vsc.valorServico) as valor_UST_Serviço,
          sum(vsc.valorservico) as total_UST,
          sum(vsc.valorServico*c.cotacaomoeda) as Valor_Serviço,
          count(s.nomeservico) as qtd,
          EXTRACT(MONTH FROM SS.DATAHORAFIM) AS MESSERVICO
        FROM solicitacaoservico ss
        INNER JOIN SERVICOCONTRATO SC ON SC.IDSERVICOCONTRATO = SS.IDSERVICOCONTRATO
        INNER JOIN VALORSERVICOCONTRATO VSC ON VSC.IDSERVICOCONTRATO = SC.IDSERVICOCONTRATO
        INNER JOIN CONTRATOS C ON C.IDCONTRATO = SC.IDCONTRATO
        INNER JOIN SERVICO S ON S.IDSERVICO = SC.IDSERVICO
        left JOIN CATEGORIASERVICO CC ON S.IDCATEGORIASERVICO = CC.IDCATEGORIASERVICO
        WHERE ss.datahorafim BETWEEN '2017-03-01 00:00:00' AND '2017-03-31 23:59:59.999'
        AND UPPER(SS.SITUACAO) = UPPER('FECHADA')
        GROUP BY case when cc.nomecategoriaservico = 'name1' or name_col = 'name3' then 'name1or3' else cc.nomecategoriaservico end, EXTRACT(MONTH FROM SS.DATAHORAFIM)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43611723

复制
相关文章

相似问题

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