проблема с исправлением подзапроса - PullRequest
0 голосов
/ 10 июля 2019

У меня есть подзапрос, который используется в качестве параметра в отчете. Этот конкретный запрос использовался в другом отчете, поэтому я пытался быть умным и использовать его снова для этого отчета. Для того, чтобы клиент сделал это, ему нужен текущий месяц и год с начала года как для прошлого года, так и для текущего года для каждого элемента. Я думаю, что у меня есть текущий месяц, однако, моя проблема в том, что что-то заменяется на дату или категорию транзакции. Ниже приведен пример

(
  customer,
  fiscalperiod,
  transactiondate,
  workcenter,
  projectid,
  eventname,
  sales,
  directlabor,
  materialscost,
  othercost,
  subcontractor,
  cogs,
  projectprofit,
  projectprofitmargin
)
AS 
 SELECT b.customer, b.fiscalperiod, b.workcenter AS transactiondate, b.projectid AS workcenter, b.eventname AS projectid, b.sales AS eventname, b.directlabor AS sales, b.materialscost AS directlabor, b.othercost AS materialscost, b.subcontractor AS othercost, b.transactiondate AS subcontractor, 
        CASE
            WHEN b.cogs > 1::double precision THEN b.cogs * (- 1::double precision)
            ELSE b.cogs
        END AS cogs, b.projectprofit, b.projectprofitmargin
   FROM ( SELECT table1.customer, table1.fiscalperiod, table1.workcenter, table1.projectid, table1.eventname, sum(table1.revenue) AS sales, sum(table1.directlabor) AS directlabor, sum(table1.materialscost) AS materialscost, sum(table1.othercost) AS othercost, sum(table1.subcontractor) AS subcontractor, table1.transactiondate, 
                CASE
                    WHEN sum(table1.expense) < 0::double precision THEN sum(table1.expense) * (- 1::double precision)
                    ELSE sum(table1.expense)
                END AS cogs, sum(table1.revenue) - 
                CASE
                    WHEN sum(table1.expense) < 0::double precision THEN sum(table1.expense) * (- 1::double precision)
                    ELSE sum(table1.expense)
                END AS projectprofit, 
                CASE
                    WHEN sum(table1.revenue) = NULL::double precision THEN 100::double precision
                    WHEN sum(table1.revenue) = 0::double precision THEN 100::double precision
                    ELSE 100::double precision * (sum(table1.revenue) + sum(table1.expense)) / sum(table1.revenue)
                END AS projectprofitmargin
           FROM ( SELECT p.customer, p.projectid, p.eventname, t.fiscalperiod, w.workcenter, t.transactiondate, 
                        CASE
                            WHEN c."type"::text = 'RV'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            ELSE 0.00::double precision
                        END AS revenue, 
                        CASE
                            WHEN c."type"::text = 'EX'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            ELSE 0.00::double precision
                        END AS expense, 
                        CASE
                            WHEN t.glaccount::text = '40020'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            ELSE 0.00::double precision
                        END AS directlabor, 
                        CASE
                            WHEN t.glaccount::text = '40000'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            ELSE 0.00::double precision
                        END AS materialscost, 
                        CASE
                            WHEN t.glaccount::text = '46200'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            WHEN t.glaccount::text = '40112'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            ELSE 0.00::double precision
                        END AS othercost, 
                        CASE
                            WHEN t.glaccount::text = '40030'::character varying::text THEN sum(
                            CASE
                                WHEN t.namount = 0.00::double precision THEN 0.00::double precision
                                ELSE t.namount
                            END)
                            ELSE 0.00::double precision
                        END AS subcontractor
                   FROM hargrade_projectlink.twprojecttransaction t
              LEFT JOIN hargrade_projectlink.vsproject p ON t.projectid::text = p.projectid::text
         LEFT JOIN hargrade_projectlink.vsworkcenter w ON t.workcenterid::text = w.id::text
    LEFT JOIN hargrade_projectlink.vscategory c ON t.categoryid::text = c.id::text
   WHERE p.customer::text <> ''::character varying::text AND t.batchtype::text <> 'BDGT'::character varying::text
   GROUP BY p.customer, p.eventname, p.projectid, t.fiscalperiod, w.workcenter, c."type", t.glaccount, t.transactiondate) table1
          GROUP BY table1.customer, table1.fiscalperiod, table1.workcenter, table1.eventname, table1.projectid, table1.transactiondate) b
  WHERE b.sales > 0::double precision;


Select sales,transactiondate
from public.vw_ytdprojectdetailfinal_copy
where transactiondate >= date_trunc('month', current_date - interval '1' month)
  and transactiondate < date_trunc('month', current_date

the desired:                  the actual:
sales  transactiondate        sales  transactiondate 
num      2018-05-08             0     account services
num      2018-05-08             0     sales
num      2018-05-08             0     other department
num      2018-05-08
num      2018-05-08
num      2018-05-08


any ideas on what I'm doing wrong?




1 Ответ

0 голосов
/ 10 июля 2019

Что такое b.workcenter?Я вижу, что вы называете это псевдонимом в качестве даты транзакции, и это, кажется, имена рабочих центров / отделов.

SELECT b.customer, b.fiscalperiod, b.workcenter AS transactiondate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...