代码之家  ›  专栏  ›  技术社区  ›  Masoom Badi

一个查询中多个条件的求和和计数

  •  0
  • Masoom Badi  · 技术社区  · 3 年前

    我是SQL新手。这就是我正在尝试的。

    表: h_invoices 样品

    因夫诺(人工智能) 投资客户 投资总额 投资报酬
    18 6750 6750
    19 酒吧 3300 3300

    表: h_invdetail 样品

    indID(人工智能) 因维人 ProductID 统一
    18 18 1. 3800
    19 18 5. 2950

    我想要的是 ProductA , ProductB 基于 ProductID 还有 totalRevenue 这就是 sum(InvTotal) .

    我试过的,比如 InvNo-18 :

    SELECT 
        sum(case when h_invdetail.ProductId = 1 then 1 else 0 end) as ProductA,
        sum(case when h_invdetail.ProductId = 6 then 1 else 0 end) as ProductB,
        sum(case when h_invdetail.ProductId = 3 then 1 else 0 end) as ProductC, 
        sum(h_invoices.InvTotal) as REVENUE 
    FROM h_invdetail 
    LEFT JOIN h_invoices ON h_invdetail.invID = h_invoices.InvNo 
    WHERE h_invoices.InvNo = 18
    

    我得到的总数是 13500 而不是 6750 例如,我必须得到整张桌子的收入和产品分布,但我得到的值是错误的 sum(h_invoices.InvTotal) .我错过什么了吗?

    0 回复  |  直到 3 年前
        1
  •  1
  •   DRapp    3 年前

    那么,您真正需要的是将两个查询打包成一个查询。要获取所有发票的总数,首先要将其设置为只返回一条记录的子查询。然后是第二个子查询,即发票#18,它将返回一条记录,然后从每个记录中提取列。由于每个表中的结果是1:1,因此可以不使用显式联接,如

    select
          PQ1.Revenue,
          PQ2.ProductA,
          PQ2.ProductB,
          PQ2.ProductC
       from
          ( SELECT sum (i.InvTotal) as Revenue 
               FROM h_invoices i ) PQ1,
          ( select
                  sum(case when d.ProductId = 1 then 1 else 0 end) as ProductA,
                  sum(case when d.ProductId = 6 then 1 else 0 end) as ProductB,
                  sum(case when d.ProductId = 3 then 1 else 0 end) as ProductC
               from h_invdetail d
               WHERE d.InvNo = 18 ) PQ2