【问题标题】:SQL How do you get the earnings in a year (revenue-expenses) without manually inserting the year?SQL如何在不手动插入年份的情况下获得一年的收入(收入-费用)?
【发布时间】:2022-01-15 08:04:22
【问题描述】:

我的代码现在看起来像这样:

Select EXTRACT(YEAR FROM d.dlvr_d),
                    (Select SUM(s.serv_p) 
                    FROM customer_orders co
                    INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
                    INNER JOIN service s ON cs.serv_id = s.serv_id
                    WHERE co.cust_ordr_delete_ind = 'False' and EXTRACT(YEAR FROM co.cust_ordr_do)= 2019
                    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do))
                    -
                    (Select SUM(s.serv_p)
                    FROM customer_orders co
                    INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
                    INNER JOIN service s ON cs.serv_id = s.serv_id
                    WHERE co.cust_ordr_delete_ind = 'False' and EXTRACT(YEAR FROM co.cust_ordr_do) = 2019
                    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do))
                    -
                    ((Select SUM(e.eqp_pp)
                    FROM equipment e
                    INNER JOIN equipment_type y on y.eqp_t_id = e.eqp_t_id
                    WHERE e.eqp_delete_ind = 'False' and y.eqp_t_delete_ind = 'False' and EXTRACT(YEAR FROM e.eqp_pd)=2019)
                    +
                    (SELECT SUM((d.prod_qty_ds)*(p.prod_up))
                    FROM product p
                    INNER JOIN delivery d ON p.prod_id = d.prod_id
                    WHERE d.dlvr_delete_ind = 'False' and EXTRACT(YEAR FROM d.dlvr_d)=2019
                    GROUP BY EXTRACT(YEAR FROM d.dlvr_d))
                    +
                    (SELECT 12*SUM(p.pos_sal)
                    FROM employee e
                    INNER JOIN positions p ON p.pos_id = e.pos_id
                    WHERE e.emp_delete_ind = 'False'))
                    FROM delivery d
                    WHERE d.dlvr_delete_ind = 'False' and EXTRACT(YEAR FROM d.dlvr_d)=2019
                    GROUP BY EXTRACT(YEAR FROM d.dlvr_d)
                    UNION
                    Select EXTRACT(YEAR FROM d.dlvr_d),
                    (Select SUM(s.serv_p) 
                    FROM customer_orders co
                    INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
                    INNER JOIN service s ON cs.serv_id = s.serv_id
                    WHERE co.cust_ordr_delete_ind = 'False' and EXTRACT(YEAR FROM co.cust_ordr_do)= 2020
                    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do))
                    -
                    (Select SUM(s.serv_p)
                    FROM customer_orders co
                    INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
                    INNER JOIN service s ON cs.serv_id = s.serv_id
                    WHERE co.cust_ordr_delete_ind = 'False' and EXTRACT(YEAR FROM co.cust_ordr_do) = 2020
                    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do))
                    -
                    ((Select SUM(e.eqp_pp)
                    FROM equipment e
                    INNER JOIN equipment_type y on y.eqp_t_id = e.eqp_t_id
                    WHERE e.eqp_delete_ind = 'False' and y.eqp_t_delete_ind = 'False' and EXTRACT(YEAR FROM e.eqp_pd)=2020)
                    +
                    (SELECT SUM((d.prod_qty_ds)*(p.prod_up))
                    FROM product p
                    INNER JOIN delivery d ON p.prod_id = d.prod_id
                    WHERE d.dlvr_delete_ind = 'False' and EXTRACT(YEAR FROM d.dlvr_d)=2020
                    GROUP BY EXTRACT(YEAR FROM d.dlvr_d))
                    +
                    (SELECT 12*SUM(p.pos_sal)
                    FROM employee e
                    INNER JOIN positions p ON p.pos_id = e.pos_id
                    WHERE e.emp_delete_ind = 'False'))
                    FROM delivery d
                    WHERE d.dlvr_delete_ind = 'False' and EXTRACT(YEAR FROM d.dlvr_d)=2020
                    GROUP BY EXTRACT(YEAR FROM d.dlvr_d)
                    UNION
                    Select EXTRACT(YEAR FROM d.dlvr_d),
                    (Select SUM(s.serv_p) 
                    FROM customer_orders co
                    INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
                    INNER JOIN service s ON cs.serv_id = s.serv_id
                    WHERE co.cust_ordr_delete_ind = 'False' and EXTRACT(YEAR FROM co.cust_ordr_do)= 2021
                    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do))
                    -
                    (Select SUM(s.serv_p)
                    FROM customer_orders co
                    INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
                    INNER JOIN service s ON cs.serv_id = s.serv_id
                    WHERE co.cust_ordr_delete_ind = 'False' and EXTRACT(YEAR FROM co.cust_ordr_do) = 2021
                    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do))
                    -
                    ((Select SUM(e.eqp_pp)
                    FROM equipment e
                    INNER JOIN equipment_type y on y.eqp_t_id = e.eqp_t_id
                    WHERE e.eqp_delete_ind = 'False' and y.eqp_t_delete_ind = 'False' and EXTRACT(YEAR FROM e.eqp_pd)=2021)
                    +
                    (SELECT SUM((d.prod_qty_ds)*(p.prod_up))
                    FROM product p
                    INNER JOIN delivery d ON p.prod_id = d.prod_id
                    WHERE d.dlvr_delete_ind = 'False' and EXTRACT(YEAR FROM d.dlvr_d)=2021
                    GROUP BY EXTRACT(YEAR FROM d.dlvr_d))
                    +
                    (SELECT 12*SUM(p.pos_sal)
                    FROM employee e
                    INNER JOIN positions p ON p.pos_id = e.pos_id
                    WHERE e.emp_delete_ind = 'False'))
                    FROM delivery d
                    WHERE d.dlvr_delete_ind = 'False' and EXTRACT(YEAR FROM d.dlvr_d)=2021
                    GROUP BY EXTRACT(YEAR FROM d.dlvr_d)

Annual EARNINGS = 年收入(服务交易的总和)- 年费用(12 个月的工资 + 采购产品到交付的费用 + 购买新设备的费用)

我通过加入服务表(包含商店提供的服务)、co_service 表(每次交易使用的服务)和客户订单表(用于交易)来获得收入,然后我按年份提取它们以获得年度价值

采购费用来自记录来料交货的交货表,设备类型表记录设备的种类(烘干机、洗衣机等),而设备是设备的单个单元(洗衣机-01、洗衣机- 02等)

最后是职位表包含每个员工职位的薪水

【问题讨论】:

  • employeepositions 表与delivery 表有什么关系?它们与日期有关吗?
  • 下一个问题,为什么你每年重复两次Select SUM(s.serv_p) FROM customer_orders co ...(Select SUM(s.serv_p) FROM customer_orders co ...) - (Select SUM(s.serv_p) FROM customer_orders co ...) 这个结果总是为零,因为查询被重复了
  • 请提供有关您的数据库结构的更多信息。

标签: python sql postgresql datetime union


【解决方案1】:

您可以先创建一个子查询,其中包含数据库中每一年的一行。在您的情况下,似乎在您的deliverycustomer_orders 表之间,每个有趣的年份都会出现。所以这样做。它会为您提供一个每年一行的虚拟表。

   SELECT DISTINCT EXTRACT(YEAR FROM dlvr_d) yr
     FROM delivery
    UNION
   SELECT DISTINCT EXTRACT(YEAR FROM cust_ordr_do) yr
    FROM customer_orders

然后,您可以编写查询以从该子查询开始,然后 LEFT JOIN 其他您想要的内容。这样的事情可能会奏效。

WITH years AS (
   SELECT DISTINCT EXTRACT(YEAR FROM dlvr_d) yr
     FROM delivery
    UNION
   SELECT DISTINCT EXTRACT(YEAR FROM cust_ordr_do) yr
    FROM customer_orders
)
SELECT years.yr, serv.serv_p
 FROM years
 LEFT JOIN (
    Select SUM(s.serv_p) serv_p, EXTRACT(YEAR FROM co.cust_order_do) yr
      FROM customer_orders co
     INNER JOIN co_service cs ON co.cust_ordr_id = cs.cust_ordr_id 
     INNER JOIN service s ON cs.serv_id = s.serv_id
     WHERE co.cust_ordr_delete_ind = 'False'
    GROUP BY EXTRACT(YEAR FROM co.cust_ordr_do)
 ) serv ON years.yr = serv.yr

这将为您提供一个每年都有一行的结果集。它将有一个为空的列(表示该年度没有结果)或您显示的查询中的有用值。

抱歉,我对您的查询理解得不够好,无法重构整个内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多