【问题标题】:How to Sumif a Sum如何总结总和
【发布时间】:2017-02-07 15:55:45
【问题描述】:

我正在尝试获得“总覆盖”,但仅当代理 = x、y 或 z 时才求和

SELECT   
    DISTINCT( "public"."rdf_dean"."agent_name" )  AS "Agent",
    SUM("public"."rdf_dean"."paidcomm" *.9) AS "Paid to Agent",
    SUM("public"."rdf_dean"."paidcomm" *.1) AS "Overrides",
    SUM overrides IF agent_name = x OR agent_name = y OR agent_name = z

FROM     "public"."rdf_dean"
WHERE "public"."rdf_dean"."created_date" = date(now())
GROUP BY agent_name

【问题讨论】:

  • 不相关,但是:distinct 不是一个函数。 distinct (a), b, cdistinct a, b, cdistinct a, b, (c) 相同
  • 谢谢,我只是复制粘贴没把括号去掉,偷懒

标签: postgresql sum


【解决方案1】:

如果您想同时为所有行和某些行同时聚合,您可以使用 FILTER (https://www.postgresql.org/docs/9.4/static/sql-expressions.html):

SELECT   
    "public"."rdf_dean"."agent_name" AS "Agent",
    SUM("public"."rdf_dean"."paidcomm" *.9) AS "Paid to Agent",
    SUM("public"."rdf_dean"."paidcomm" *.1) AS "Overrides",
    SUM("public"."rdf_dean"."paidcomm" *.1) 
        FILTER (WHERE agent_name = x OR agent_name = y OR agent_name = z)
        AS "Partial Overrides",
FROM     "public"."rdf_dean"
WHERE "public"."rdf_dean"."created_date" = date(now())
GROUP BY agent_name

【讨论】:

    【解决方案2】:

    据我了解您的要求,只有在代理是 x、y、z 的情况下,您才需要总结总数

    所以无论是嵌套查询:

    SELECT "Agent", sum("Overrides")
    FROM 
    (
    SELECT   
        "public"."rdf_dean"."agent_name"   AS "Agent",
        SUM("public"."rdf_dean"."paidcomm" *.9) AS "Paid to Agent",
        SUM("public"."rdf_dean"."paidcomm" *.1) AS "Overrides"
    FROM     "public"."rdf_dean"
    WHERE "public"."rdf_dean"."created_date" = date(now())
    GROUP BY agent_name
    ) as data 
    WHERE 
    data."Agent" in (x, y, z)
    

    或者

    SELECT   
        "public"."rdf_dean"."agent_name"   AS "Agent",
        SUM("public"."rdf_dean"."paidcomm" *.9) AS "Paid to Agent",
        SUM("public"."rdf_dean"."paidcomm" *.1) AS "Overrides"
    FROM     "public"."rdf_dean"
    WHERE "public"."rdf_dean"."created_date" = date(now())
    AND  "public".rdf_dean.agent_name in (x, y, z) 
    GROUP BY agent_name 
    

    或者,如果您需要两者,则支付给代理并仅由代理覆盖

    SELECT   
        "public"."rdf_dean"."agent_name"   AS "Agent",
        SUM("public"."rdf_dean"."paidcomm" *.9) AS "Paid to Agent",
        SUM("public"."rdf_dean"."paidcomm" *.1) AS "Overrides", 
        (SELECT SUM("public"."rdf_dean"."paidcomm" *.1) 
          FROM  "public"."rdf_dean"  internal 
          WHERE 
             internal.agent_name = out.agent_name 
             AND 
             internal.agent_name in (x, y, z)  ) AS "OverridesXYZ"
    FROM     "public"."rdf_dean" out
    WHERE "public"."rdf_dean"."created_date" = date(now())
    GROUP BY agent_name 
    

    或者你可以

    SELECT   
        "public"."rdf_dean"."agent_name"   AS "Agent",
        SUM("public"."rdf_dean"."paidcomm" *.9) AS "Paid to Agent",
        SUM("public"."rdf_dean"."paidcomm" *.1) AS "Overrides", 
        SUM(internal.paidcomm * .1)  AS "OverridesXYZ"
    FROM     "public"."rdf_dean" out
    LEFT JOIN public.rdf_dean internal ON internal.agent_name = out.agent_name  AND internal.agent_name in (x, y, z)   
    WHERE "public"."rdf_dean"."created_date" = date(now())
    GROUP BY agent_name 
    

    【讨论】:

    • 第二个查询有效,但是我认为我需要更好地解释我想要什么。我只需要覆盖来计算特定代理“x、y、z”,但是我仍然需要“支付给代理”的总和来显示所有其他代理、a、b、c 等...
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2014-07-28
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 2012-04-18
    • 1970-01-01
    相关资源
    最近更新 更多