I have to access only -ve values of balance - oracle10g

select sum(b.budget) as Budget,sum(b.rev) as Revised,sum(b.expe) as Expenditure,(sum(b.budget) + sum(b.rev) - sum(b.expe)) as balance,
b.accounts,b.abac_code,
b.abac_name,b.dac_code,b.dac_name,b.abacname
from
(
select upper('Budget') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname
,0 Accounts,nvl(sum(nvl(g3.amt,0)),0) as budget,0 rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4 and d.sl =afld_sl5 and upper(g3.typ) = upper('budget')
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl = :drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Revised') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,nvl(sum(nvl(rev_amt,0)),0) as rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4 and d.sl =afld_sl5 and upper(g3.typ) = upper('budget')
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl =:drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Expenditure') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,0 rev,nvl(sum(nvl((abs(g.amt)),0)),0) expe
from gl g,chq c,acct_master ac,abac a ,dac d
where upper(typ) = upper('pay2') and g.vouchr_no>0 and g.amt>0 and g.acct_sl =ac.sl and ac.afld_sl4 =a.sl and ac.afld_sl5 =d.sl
and g.chq_sl=c.sl and g.drange_sl =:drange_sl and c.doc_date between :from_date and :to_date
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl)
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
group by a.sl,a.code ,a.name ,d.code,d.name
order by dac_code
) b
group by b.abac_code,b.abac_name,b.dac_code,b.dac_name,b.abacname,b.accounts
order by balance

If you want to reference the balance you have to embrace it again into a subquery
select *
from (
select sum(b.budget) as Budget,
sum(b.rev) as Revised,
sum(b.expe) as Expenditure,
(sum(b.budget) + sum(b.rev) - sum(b.expe)) as balance,
b.accounts, b.abac_code, b.abac_name, b.dac_code, b.dac_name, b.abacname
from
(
select upper('Budget') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname
,0 Accounts,nvl(sum(nvl(g3.amt,0)),0) as budget,0 rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4 and d.sl =afld_sl5 and upper(g3.typ) = upper('budget')
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl = :drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Revised') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,nvl(sum(nvl(rev_amt,0)),0) as rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4 and d.sl =afld_sl5 and upper(g3.typ) = upper('budget')
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl =:drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Expenditure') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,0 rev,nvl(sum(nvl((abs(g.amt)),0)),0) expe
from gl g,chq c,acct_master ac,abac a ,dac d
where upper(typ) = upper('pay2') and g.vouchr_no>0 and g.amt>0 and g.acct_sl =ac.sl and ac.afld_sl4 =a.sl and ac.afld_sl5 =d.sl
and g.chq_sl=c.sl and g.drange_sl =:drange_sl and c.doc_date between :from_date and :to_date
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl)
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
group by a.sl,a.code ,a.name ,d.code,d.name
order by dac_code
) b
group by b.abac_code,b.abac_name,b.dac_code,b.dac_name,b.abacname,b.accounts
) a
where balance < 0
order by balance
I have not tried it but you can also using the HAVING clause
select sum(b.budget) as Budget,
sum(b.rev) as Revised,
sum(b.expe) as Expenditure,
(sum(b.budget) + sum(b.rev) - sum(b.expe)) as balance,
b.accounts, b.abac_code, b.abac_name, b.dac_code, b.dac_name, b.abacname
from
(
select upper('Budget') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname
,0 Accounts,nvl(sum(nvl(g3.amt,0)),0) as budget,0 rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4 and d.sl =afld_sl5 and upper(g3.typ) = upper('budget')
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl = :drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Revised') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,nvl(sum(nvl(rev_amt,0)),0) as rev,0 expe
from abac a,dac d,acct_master ac,gl3 g3
where g3.acct_sl=ac.sl and a.sl=ac.afld_sl4 and d.sl =afld_sl5 and upper(g3.typ) = upper('budget')
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl )
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
and g3.drange_sl =:drange_sl
group by a.sl,a.code ,a.name ,d.code,d.name
union all
select upper('Expenditure') typ,a.sl abac_sl,a.code abac_code,a.name abac_name,d.code dac_code,d.name dac_name,a.code || ' - ' || a.name abacname,
0 Accounts,0 budget,0 rev,nvl(sum(nvl((abs(g.amt)),0)),0) expe
from gl g,chq c,acct_master ac,abac a ,dac d
where upper(typ) = upper('pay2') and g.vouchr_no>0 and g.amt>0 and g.acct_sl =ac.sl and ac.afld_sl4 =a.sl and ac.afld_sl5 =d.sl
and g.chq_sl=c.sl and g.drange_sl =:drange_sl and c.doc_date between :from_date and :to_date
and d.sl in (select sl from selall where upper(table_name) = upper('dac') and user_sl = :user_sl)
and a.sl in (select sl from selall where upper(table_name) = upper('abac3') and upper(typ) = upper('pabac') and user_sl = :user_sl )
group by a.sl,a.code ,a.name ,d.code,d.name
order by dac_code
) b
group by b.abac_code,b.abac_name,b.dac_code,b.dac_name,b.abacname,b.accounts
having (sum(b.budget) + sum(b.rev) - sum(b.expe)) < 0
order by balance

Related

How to optimize postgresql using functions or procedure

How to optimize postgreql when The report is extremely slow. Im looking for a way to reduce subqueries. I have multiple of these subqueries doing the same calculation but with different parameter intervals. e.g interval 'day 271', interval 'day 365'. Each cal for each interval is done in a separate subquery currently, would like to implement this another way and avoid subqueries, since i realized they making the report generation really slow.
SELECT
merchandiseCode,
merchandiseDescription,
merchandiseCategory_ID,
merchandiseCategory,
Case OnHand WHEN 0 THEN 0 ELSE CurrentCost*OnHand END AS CurrentCost,
CASE WHEN qty5>0 OR qty4>0 OR qty3>0 OR qty2>0 THEN stock1 ELSE CASE WHEN
qty1 >0 THEN qty1 ELSE 0 END END as qty1,
CASE WHEN qty5>0 OR qty4>0 OR qty3>0 THEN stock2 ELSE CASE WHEN qty2>0
THEN qty2 ELSE 0 END END as qty2,
CASE WHEN qty5>0 OR qty4>0 THEN stock3 ELSE CASE WHEN qty3 >0 THEN qty3
ELSE 0 END END AS qty3,
CASE WHEN qty5>0 THEN Stock4 ELSE CASE WHEN qty4> 0 THEN qty4 ELSE 0 END
END AS qty4,
CASE WHEN qty5>0 THEN qty5 ELSE 0 END As qty5,
stock1,
stock2,
stock3,
stock4,
OnHand,
CASE WHEN qty5>0 OR qty4>0 OR qty3>0 OR qty2>0 THEN round(stock1*
(cost1),2) ELSE CASE WHEN qty1 >0 THEN round(qty1*(cost1),2) ELSE 0 END
END as value1,
CASE WHEN qty5>0 OR qty4>0 OR qty3>0 THEN round(stock2*(cost2),2) ELSE
CASE WHEN qty2>0 THEN round(qty2*(cost2),2) ELSE 0 END END as value2,
CASE WHEN qty5>0 OR qty4>0 THEN round(Stock3*(Cost3),2) ELSE CASE WHEN
qty3 >0 THEN round(qty3*(cost3),2) ELSE 0 END END as value3,
CASE WHEN qty5>0 THEN round(Stock4*(Cost4),2) ELSE CASE WHEN qty4>0 THEN
round(qty4*(Cost4),2) ELSE 0 END END as value4,
CASE WHEN qty5>0 THEN round(qty5*(cost4),2) ELSE 0 END as value5
from (
SELECT
prod.value as merchandiseCode,
prod.description as merchandiseDescription,
prod.merchandiseCategory_ID as merchandiseCategory_ID,
prodcat.name AS merchandiseCategory,
(SELECT COALESCE((cos.NewCostPrice),0)
FROM M_CostM cos WHERE cos.Created = (SELECT MAX(c.Created)
FROM M_CostM c
LEFT JOIN M_CostElement ce on ce.M_CostElement_UU='bf6ee9b8-4600-480b-
b415-f94c698b0648'
WHERE
prod.M_Product_ID = c.M_Product_ID AND prod.ProductType !='A'
AND c.created <= ('2020-02-17'::date)
AND c.Customer_ID =1000008 AND c.C_AcctSchema_ID = 1000009
AND c.M_CostElement_ID=ce.M_CostElement_ID
AND c.rg_ID = CASE WHEN c.AD_Org_ID =0 Then c.AD_Org_ID ELSE 1000002
END
)) as CurrentCost,
(SELECT COALESCE(SUM(t.movementqty),0) FROM M_merchandise t WHERE
t.M_Product_ID=1013449 AND t.Customer_ID =1000008
AND t.movementdate > (('2020-02-17'::date)-interval 'day 90')
AND t.movementdate <('2020-02-17'::date)
AND t.rg_ID =1000044
AND t.movementtype IN('I+','M+','P+','V+','W+')) AS stock1, ----stock
exist from previous brackets
(SELECT (SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I+','M+','P+','V+','W+')
AND t.movementdate<('2020-02-17'::date)
AND t.rg_ID =1000044 ) +
(SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I-','C-','M-','P-','V-','W-')
AND t.movementdate<('2020-02-17'::date)
AND t.rg_ID = 1000044)) AS qty1,
(SELECT COALESCE(SUM(t.movementqty),0) FROM M_merchandise t WHERE
t.M_Product_ID=1013449 AND t.Customer_ID =1000008
AND t.movementdate > (('2020-02-17'::date)-interval 'day 180')
AND t.movementdate <= (('2020-02-17'::date)-interval 'day 91')
AND t.rg_ID =1000044
AND t.movementtype IN('I+','M+','P+','V+','W+')) AS stock2, ----stock
exist from previous brackets
(SELECT (SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I+','M+','P+','V+','W+')
AND t.movementdate<(('2020-02-17'::date)- interval 'day 91')
AND t.rg_ID =1000044 ) +
(SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I-','C-','M-','P-','V-','W-')
AND t.movementdate<('2020-02-17'::date)
AND t.rg_ID = 1000044)) AS qty2,
(SELECT COALESCE(SUM(t.movementqty),0) FROM M_merchandise t WHERE
t.M_Product_ID=1013449 AND t.Customer_ID =1000008
AND t.movementdate > (('2020-02-17'::date)-interval 'day 181')
AND t.movementdate <= (('2020-02-17'::date)-interval 'day 270')
AND t.rg_ID =1000002
AND t.movementtype IN('I+','M+','P+','V+','W+')) AS stock3, ----stock
exist from previous brackets
(SELECT (SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I+','M+','P+','V+','W+')
AND t.movementdate<(('2020-02-17'::date)- interval 'day 181')
AND t.rg_ID =1000044) +
(SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I-','C-','M-','P-','V-','W-')
AND t.movementdate<('2020-02-17'::date)
AND t.rg_ID = 1000044)) AS qty3,
(SELECT COALESCE(SUM(t.movementqty),0) FROM M_merchandise t WHERE
t.M_Product_ID=1013449 AND t.Customer_ID =1000008
AND t.movementdate > (('2020-02-17'::date)-interval 'day 271') AND
t.movementdate > (('2020-02-17'::date)-interval 'day 365')
AND t.rg_ID =1000044
AND t.movementtype IN('I+','M+','P+','V+','W+')) AS stock4,
(SELECT (SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID=1000008
AND t.movementtype IN('I+','M+','P+','V+','W+')
AND t.movementdate<(('2020-02-17'::date)- interval 'day 271')
AND t.rg_ID =1000044 ) +
(SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I-','C-','M-','P-','V-','W-')
AND t.movementdate<('2020-02-17'::date)
AND t.rg_ID = 1000002)) AS qty4, -----no previous stock in previous
brackets
(SELECT (SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I+','M+','P+','V+','W+')
AND t.movementdate<(('2020-02-17'::date)-interval 'day 366')
AND t.rg_ID =1000044 ) +
(SELECT SUM(t.movementqty) FROM M_merchandise t WHERE
t.M_Product_ID=1013449
AND t.Customer_ID =1000008
AND t.movementtype IN('I-','C-','M-','P-','V-','W-')
AND t.movementdate<('2020-02-17'::date)
AND t.rg_ID = 1000044 ) ) AS qty5,
(SELECT COALESCE((cos.NewCostPrice),0)
FROM history cos
LEFT JOIN M_CostElement ce on ce.M_CostElement_UU='bf6ee9b8-4600-480b-
b415-
f94c698b0648'
LEFT JOIN m_costdetail md ON md.m_costdetail_id=cos.m_costdetail_id
WHERE prod.M_Product_ID = md.M_Product_ID AND prod.ProductType !='A'
AND cos.Customer_ID =1000008 AND md.Schema_ID = 1000004
AND cos.created >= (('2020-02-17'::date) - interval '3 month' )
AND cos.created < ('2020-02-17'::date)
AND cos.M_CostElement_ID=ce.M_CostElement_ID
AND cos.rg_ID = CASE WHEN cos.rg_ID =0 Then cos.rg_ID ELSE
1000002 END
ORDER BY cos.created DESC limit 1
)as Cost1,
(SELECT COALESCE((cos.NewCostPrice),0)
FROM history cos
LEFT JOIN M_CostElement ce on ce.M_CostElement_UU='bf6ee9b8-4600-480b-
b415-
f94c698b0648'
LEFT JOIN m_costdetail md ON md.m_costdetail_id=cos.m_costdetail_id
WHERE prod.M_Product_ID = md.M_Product_ID AND prod.ProductType !='A'
AND cos.Customer_ID =1000008 AND md.Schema_ID= 1000004
AND cos.created < (('2020-02-17'::date) - interval '3 month')
AND cos.created < (('2020-02-17'::date) - interval '6 month')
AND cos.M_CostElement_ID=ce.M_CostElement_ID
AND cos.rg_ID = CASE WHEN cos.rg_ID =0 Then cos.rg_ID ELSE
1000002 END
ORDER BY cos.created DESC limit 1
)as Cost2,
(SELECT COALESCE((cos.NewCostPrice),0)
FROM history cos
LEFT JOIN M_CostElement ce on ce.M_CostElement_UU='bf6ee9b8-4600-480b-
b415-
f94c698b0648'
LEFT JOIN m_costdetail md ON md.m_costdetail_id=cos.m_costdetail_id
WHERE prod.M_Product_ID = md.M_Product_ID AND prod.ProductType !='A'
AND cos.Customer_ID =1000008 AND md.Schema_ID = 1000004
AND cos.created >= (('2020-02-17'::date) - interval '12 month' )
AND cos.created < (('2020-02-17'::date) - interval '6 month')
AND cos.M_CostElement_ID=ce.M_CostElement_ID
AND cos.rg_ID = CASE WHEN cos.rg_ID =0 Then cos.rg_ID ELSE
1000002 END
ORDER BY cos.created DESC limit 1
)as Cost3,
(SELECT COALESCE((cos.NewCostPrice),0)
FROM history cos
LEFT JOIN M_CostElement ce on ce.M_CostElement_UU='bf6ee9b8-4600-480b-b415-
f94c698b0648'
LEFT JOIN m_costdetail md ON md.m_costdetail_id=cos.m_costdetail_id
WHERE prod.M_Product_ID = md.M_Product_ID AND prod.ProductType !='A'
AND cos.Customer_ID =1000008 AND md.Schema_ID = 1000004
AND cos.created < (('2020-02-17'::date)- interval '12 month')
AND cos.M_CostElement_ID=ce.M_CostElement_ID
AND cos.rg_ID = CASE WHEN cos.rg_ID =0 Then cos.rg_ID ELSE
1000002 END
ORDER BY cos.created DESC limit 1
) as Cost4,
(SELECT COALESCE (SUM (st.qtyonhand),0)FROM M_Storage st
WHERE prod.M_Product_ID = st.M_Product_ID
AND st.rg_ID = 1000044 AND prod.ProductType !='A'
AND st.DateMaterialPolicy <= ( '2020-02-17'::date)
) as OnHand
(SELECT COALESCE((cos.NewCostPrice),0)
FROM m_costhistory cos
LEFT JOIN CostElem ce on ce.M_CostElem_UU='bf6ee9b8-4600-480b-b415-
f94c698b0648'
LEFT JOIN costd md ON md.m_costd_id=cos.m_c
You excerpt does not look syntactically valid to me. Please show it in a larger context.
Generally you can take the common conditions and put them in the WHERE clause of the query itself, and take the peculiar conditions and put them in WHERE clause of a FILTER.
So you could have something like this:
select
SUM(t.merchandiseqty) FILTER
(where t.merchandisetype IN('I+','M+','P+','V+','W+') AND t.merchandisedate<('2020-02-17'::date- interval 'day 271')) as whatever1,
SUM(t.merchandiseqty) FILTER
(where t.merchandisetype IN ('I-','C-','M-','P-','V-','W-') AND t.merchandisedate<('2020-02-17'::date)) as qty1
FROM t WHERE t.M_merchandise_ID=1013449 AND t.customer_ID =1000008
Since your example was incomplete, I had to fill in the gaps with intuition.
It might also be helpful to move the least restrictive of the merchandisedate conditions out of the FILTER and into the main WHERE.

Double Select into NOT IN

I have this query:
SELECT * FROM (
SELECT DISTINCT on (i.empleado) i.id as id,i.dia as dia,e.id as empleadoId,pe.nombre as personaNombre,pe.apellido1 as personaApellido1,pe.apellido2 personaApellido2 FROM rrhh.imputacion as i
INNER JOIN rrhh.empleado as e ON e.id = i.empleado
JOIN commons.persona AS pe ON e.persona_comun = pe.id
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id
INNER JOIN rrhh.parte as p ON pi.parte = p.id
WHERE p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 and e.id
NOT IN(
SELECT DISTINCT on (i.empleado) i.empleado FROM rrhh.imputacion as i
INNER JOIN rrhh.empleado as e ON e.id = i.empleado
JOIN commons.persona AS pe ON e.persona_comun = pe.id
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id
INNER JOIN rrhh.parte as p ON pi.parte = p.id
WHERE i.dia >= '2017-12-04' AND i.dia <= '2017-12-10' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2
ORDER BY i.empleado, i.dia DESC,i.id
)
ORDER BY i.empleado, i.dia DESC,i.id)
t
ORDER BY t.dia DESC
I need to add the query below in the "NOT IN", with an OR:
SELECT DISTINCT on (a.empleado) a.empleado FROM rrhh.ausencia as a
INNER JOIN rrhh.empleado as e ON e.id = a.empleado
JOIN commons.persona AS pe ON e.persona_comun = pe.id
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = a.id
INNER JOIN rrhh.parte as p ON pi.parte = p.id
WHERE a.dia >= '2017-12-04' AND a.dia <= '2017-12-11' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2
ORDER BY a.empleado, a.dia DESC,a.id
There should be something similar to what I put down, but that does not work, because I do not know the syntax, I tried an OR and a UNION, but in both cases I get an error:
SELECT * FROM (
SELECT DISTINCT on (i.empleado) i.id as id,i.dia as dia,e.id as empleadoId,pe.nombre as personaNombre,pe.apellido1 as personaApellido1,pe.apellido2 personaApellido2 FROM rrhh.imputacion as i
INNER JOIN rrhh.empleado as e ON e.id = i.empleado
JOIN commons.persona AS pe ON e.persona_comun = pe.id
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id
INNER JOIN rrhh.parte as p ON pi.parte = p.id
WHERE p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2 and e.id
NOT IN(
SELECT DISTINCT on (i.empleado) i.empleado FROM rrhh.imputacion as i
INNER JOIN rrhh.empleado as e ON e.id = i.empleado
JOIN commons.persona AS pe ON e.persona_comun = pe.id
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = i.id
INNER JOIN rrhh.parte as p ON pi.parte = p.id
WHERE i.dia >= '2017-12-04' AND i.dia <= '2017-12-10' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2
ORDER BY i.empleado, i.dia DESC,i.id
OR -- UNION
SELECT DISTINCT on (a.empleado) a.empleado FROM rrhh.ausencia as a
INNER JOIN rrhh.empleado as e ON e.id = a.empleado
JOIN commons.persona AS pe ON e.persona_comun = pe.id
INNER JOIN rrhh.parte__imputaciones as pi ON pi.imputacion = a.id
INNER JOIN rrhh.parte as p ON pi.parte = p.id
WHERE a.dia >= '2017-12-04' AND a.dia <= '2017-12-11' and p.borrador = false AND e.fecha_fin_contrato IS NULL AND e.security_domain_id = 2
ORDER BY a.empleado, a.dia DESC,a.id
)
ORDER BY i.empleado, i.dia DESC,i.id)
t
ORDER BY t.dia DESC
I need to add the query below in the "NOT IN", with an OR:
I don't know what you mean by "with an OR". If you mean that e.id should be NOT IN the first subquery OR not in the second subquery, you could do:
...
AND (
e.id NOT IN (
SELECT DISTINCT ...
) OR (
e.id NOT IN (
SELECT DISTINCT ...
)
)
If you don't want it to be in either (hence the attempt at a union) just change the OR to AND.
Although I suspect the query plan for this query will be quite poor. IN and NOT IN are inefficient when there are lots of results in there.
Also the code is quite strange. Most of your joins are explicitly INNER JOINs, but a couple just say JOIN. But JOIN by default is an INNER JOIN. So why are some lines explicit and others implicit? And why the difference in styles throughout the code? Case in point, AS vs as, from one line to the next...

MOODLE SQL only return results where user is in same group student

SELECT ra.id,
DATE_FORMAT(FROM_UNIXTIME(ra.timemodified),'%d-%m-%Y') AS Enrolment_Date,
c.fullname,
IFNULL(cmc.completed, 0) as 'Activities Completed',
u.firstname,
u.lastname,
DATE_FORMAT(FROM_UNIXTIME(cc.timecompleted),'%d-%m-%Y') AS complete_date,
CONCAT('<a target="_new" href="%%WWWROOT%%/user/profile.php?id=',ra.userid,'">', u.firstname, ' ', u.lastname, '</a>') AS Username
FROM prefix_role_assignments AS ra
JOIN prefix_user u ON ra.userid = u.id
JOIN prefix_context AS ctx ON ctx.id = ra.contextid
JOIN prefix_course c ON c.id = ctx.instanceid
JOIN prefix_enrol e ON e.courseid = c.id
JOIN prefix_user_enrolments ue ON ue.enrolid = e.id AND ue.userid = u.id
LEFT JOIN prefix_course_completions cc ON cc.course = c.id AND cc.userid = u.id
LEFT JOIN prefix_grade_items gi ON gi.courseid = c.id AND gi.itemtype = 'course'
LEFT JOIN prefix_grade_grades g ON g.itemid = gi.id AND g.userid =u.id
LEFT JOIN (SELECT cmc.userid, cm.course, COUNT(cmc.id) as completed FROM prefix_course_modules_completion cmc, prefix_course_modules cm WHERE cm.visible = 1 AND cmc.coursemoduleid = cm.id AND cmc.completionstate IN ('1','2') GROUP BY cm.course, cmc.userid) cmc ON cmc.course = c.id AND cmc.userid = u.id
WHERE u.id > 0 AND (c.id IN(
SELECT DISTINCT(ctx.instanceid) as id
FROM prefix_role_assignments ra JOIN prefix_context ctx ON ra.contextid = ctx.id
WHERE ra.userid = %%USERID%% AND ctx.contextlevel = 50 AND ra.roleid IN ('1','9','2','3','4','10'))
OR c.id IN(
SELECT distinct(c.id) as id FROM prefix_role_assignments ra
JOIN prefix_context ctx ON ra.contextid = ctx.id
JOIN prefix_course c ON c.category = ctx.instanceid
WHERE ra.userid = %%USERID%% AND ctx.contextlevel = 40 AND ra.roleid IN ('1','9','2','3','4','10'))
) AND u.deleted = 0 AND u.suspended = 0 AND u.username <> 'guest' AND c.visible = 1 AND ue.status = 0 AND e.status = 0 AND ra.roleid = '5'
GROUP BY ra.userid, ctx.instanceid HAVING u.firstname LIKE 'student' ESCAPE '\\'
Hi all,
Im struggling here, I cant seem to get how to only return results from the above query where the user running the query (%%USERID%%) shares the same groups as the student. This is a query cobbled together from a number of other queries and works perfectly except for that one thing.
Ive tried to tack on the following in various ways into this but cant get it to work at all
SELECT g.name, gm.groupid, u.firstname
FROM mdl_groups as g
JOIN mdl_groups_members as gm ON g.id = gm.groupid
JOIN mdl_user as u ON u.id = gm.userid AND u.id = 'student', %%USERID%%'
Any help at all even a point in the right direction would be great, this isnt my job role as such but Ive been tasked to make something like this happen.
Thanks for reading
It seems that the subquery boils down to just some userids, but this needs to return rows.
SELECT DISTINCT
gms.userid
FROM mdl_groups_members gms
INNER JOIN mdl_groups_members AS gmu ON gms.groupid = gmu.groupid
WHERE gmu.userid = %%USERID%%
AND gms.userid LIKE 'student%'
If it does then it needs to link to the correct place. Now his is quiet a leap, but and it "might" be used this way: (select * is not recommended, just an abbreviation):
SELECT
*
FROM prefix_role_assignments AS ra
INNER JOIN prefix_user u ON ra.userid = u.id
INNER JOIN (
SELECT DISTINCT
gms.userid
FROM mdl_groups_members gms
INNER JOIN mdl_groups_members AS gmu ON gms.groupid = gmu.groupid
WHERE gmu.userid = %%USERID%%
AND gms.userid LIKE 'student%'
) sg ON ra.userid = sg.userid
INNER JOIN prefix_context AS ctx ON ctx.id = ra.contextid
INNER JOIN prefix_course c ON c.id = ctx.instanceid
INNER JOIN prefix_enrol e ON e.courseid = c.id
INNER JOIN prefix_user_enrolments ue ON ue.enrolid = e.id AND ue.userid = u.id
LEFT JOIN prefix_course_completions cc ON cc.course = c.id AND cc.userid = u.id
LEFT JOIN prefix_grade_items gi ON gi.courseid = c.id AND gi.itemtype = 'course'
LEFT JOIN prefix_grade_grades g ON g.itemid = gi.id AND g.userid = u.id
LEFT JOIN (
SELECT
cmc.userid
, cm.course
, COUNT(cmc.id) AS completed
FROM prefix_course_modules_completion cmc
, prefix_course_modules cm
WHERE cm.visible = 1
AND cmc.coursemoduleid = cm.id
AND cmc.completionstate IN ('1', '2')
GROUP BY
cm.course
, cmc.userid
) cmc ON cmc.course = c.id AND cmc.userid = u.id
WHERE u.id > 0
AND (
c.id IN (
SELECT DISTINCT
(ctx.instanceid) AS id
FROM prefix_role_assignments ra
INNER JOIN prefix_context ctx ON ra.contextid = ctx.id
WHERE ra.userid = %%USERID%% AND ctx.contextlevel = 50
AND ra.roleid IN ('1', '9', '2', '3', '4', '10')
)
OR c.id IN (
SELECT DISTINCT
(c.id) AS id
FROM prefix_role_assignments ra
INNER JOIN prefix_context ctx ON ra.contextid = ctx.id
INNER JOIN prefix_course c ON c.category = ctx.instanceid
WHERE ra.userid = %%USERID%% AND ctx.contextlevel = 40
AND ra.roleid IN ('1', '9', '2', '3', '4', '10')
)
)
AND u.deleted = 0
AND u.suspended = 0
AND u.username <> 'guest'
AND c.visible = 1
AND ue.STATUS = 0
AND e.STATUS = 0
AND ra.roleid = '5'
GROUP BY
ra.userid
, ctx.instanceid
HAVING u.firstname LIKE 'student%' ESCAPE '\\'

What kind of opportunities to perform this sql code

In this code I have 2 select that I use more times, there are a possibility to write into a variable or another way to perform this one?
Select CASE WHEN (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) is null
THEN 0
ELSE (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante and Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) END AS eReserviert,
CASE WHEN (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) is null
THEN 0
ELSE (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) END AS eBestellt,
(ArtikelLager.Lagerstand
-
CASE WHEN (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) is null
THEN 0
ELSE (SELECT Sum(Menge-Geliefert) AS tReserviert FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Status > 1 and Pendenzen.Buchungstyp = 1) END
+
CASE WHEN (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) is null
THEN 0
ELSE (SELECT Sum(Menge-Geliefert) AS tBestellt FROM PendenzenZeilen INNER JOIN Pendenzen ON PendenzenZeilen.Buchungs_ID = Pendenzen.Buchungs_ID
WHERE Artikel_ID = Artikel.Artikel_ID AND Variante = ArtikelLager.Variante AND Pendenzen.Lagerort = 0 AND Pendenzen.Buchungstyp = 2) END) AS eZumVerkauf
from ((Artikel
inner join ArtikelLager on Artikel.Artikel_ID = ArtikelLager.Artikel_ID)
inner join ArtikelLieferanten on Artikel.Artikel_ID = ArtikelLieferanten.Artikel_ID)
where ArtikelLager.Lager_ID = 0 and Artikel_Status = 0
order by Bezeichnung, Variante
also I need to use eZumVerkauf in where condition, thank you!!
I think you need to do your joins in an inner select with the most restrictive conditions, then work with the results. For the inner select, try something like:
SELECT
z.Buchungs_ID, a.Artikel_ID, a.Variante
Menge-Geliefert as tReserviert, Lagerstand, p.Status, p.Buchungstyp
FROM
PendenzenZeilen z INNER JOIN
Pendenzen p ON
z.Buchungs_ID = p.Buchungs_ID INNER JOIN
Artikel a on
p?.Artikel_ID = a.Artikel_ID INNER JOIN
Variante v on
a.Variante = v.Variante -- inner join ArtikelLieferant al on ??
WHERE
p.Lagerort = 0 AND
((Status > 1 and p.Buchungstyp = 1) or p.Buchungstyp =2))
then you can apply your case conditions in an outer select (not sure I have this the way you need it as some conditions are missing):
Select
CASE WHEN tReserviert is null THEN 0
when Buchungstyp = 1 then Sum(tReserviert) END AS eReserviert,
CASE WHEN tReserviert is null THEN 0
when Buchungstyp = 2 then Sum(tReserviert) END AS eBestellt,
(Lagerstand
-
CASE WHEN tReserviert is null THEN 0
when Buchungstyp = 1 then Sum(tReserviert) END
+
CASE WHEN tReserviert is null THEN 0
when Buchungstyp = 2 then Sum(tReserviert ) end AS eZumVerkauf
from (inner SELECT) s

VERY WEIRD T-SQL issue - query works but not if I encapsulate it as a sub-query to just select * from ()

I have the following code which works FANTASTIC. Except - It is a sub-query to another (final) outer query and when I attempt to encapsulate this as a sub-query it refuses to run. To make it simple, I just did a "SELECT * FROM ( MY QUERY HERE)" and that even fails to run. I can only figure I am putting the right ")" in the wrong spot, but I just don't know....
Anyway - this is the query that runs fine till it is a simple sub-query:
SELECT FK_Campaign, FK_Geography, FK_InvoiceDate, FK_SalesType, FK_CustGroup, FK_Customer_Detail, FK_Parent_Detail, FK_Department, FK_Item_Detail,
FK_ItemClass_Detail, FK_ItemGroup_Detail, FK_SalesRep, FK_SalesOrigin, FK_QualityCode, FK_QualityDetailCode, FK_ResponsibilityCode,
FK_NewItemFlag, FK_TransDate, FK_CreatedDate, FK_VMReceivedDate, FK_ReturnAction, FK_StatusCode, ABC.InvoiceId, SalesID, VMRaNumber,
RetDays, ReturnQty, LineAmountmst, Qty, ReturnDays, ReturnLineAmount, ListPrice, ABC.InventTransId, ABC.ItemId,
ZZZ.FK_InventSerialProdDate AS FK_InventSerialProdDate
FROM
(SELECT
ISNULL((SELECT campaignkey --PK_Campaign
FROM VMDWAnalytical.DBO.DIM_Campaign
WHERE CampaignID = ST.smmCampaignID), -99) FK_Campaign,
ISNULL((SELECT PK_Geography
FROM VMDWAnalytical.DBO.DIM_Geography G
WHERE G.Country = ISNULL(CIJ.DLVCountryRegionID, 'zUnknown')
AND G.State = ISNULL(CIJ.DLVState, 'zUnknown')
AND G.Zip = ISNULL(CIJ.DLVZipCode, 'zUnknown')), -99) FK_Geography,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = CIJ.InvoiceDate), 1) FK_InvoiceDate,
ISNULL((SELECT PK_SalesType
FROM VMDWAnalytical.DBO.DIM_SalesType
WHERE SalesType = SL.SalesType), -99) FK_SalesType,
ISNULL((SELECT PK_CustGroup
FROM VMDWAnalytical.DBO.DIM_CustGroup
WHERE CustGroup = CT.CustGroup), -99) FK_CustGroup,
ISNULL((SELECT PK_Customer_Detail
FROM VMDWAnalytical.DBO.DIM_Customer_Detail
WHERE AccountNum = CIJ.OrderAccount), -99) FK_Customer_Detail,
ISNULL((SELECT PK_Parent_Detail
FROM VMDWAnalytical.DBO.DIM_Parent_Detail
WHERE AccountNum = CIJ.OrderAccount), -99) FK_Parent_Detail,
ISNULL((SELECT PK_Department
FROM VMDWAnalytical.DBO.DIM_Department D
WHERE D.NUM = CIT.Dimension), -99) FK_Department,
ISNULL((SELECT PK_Item_Detail
FROM VMDWAnalytical.dbo.DIM_Item_Detail
WHERE Item = IT.ItemID
AND (ConfigID = ID.ConfigID
OR ConfigID = 'NONE')), -99) FK_Item_Detail,
ISNULL((SELECT PK_ItemClass_Detail
FROM VMDWAnalytical.dbo.DIM_ItemClass_Detail
WHERE ItemID = IT.ItemID), -99) FK_ItemClass_Detail,
ISNULL((SELECT PK_ItemGroup_Detail
FROM VMDWAnalytical.dbo.DIM_ItemGroup_Detail
WHERE ItemID = IT.ItemID), -99) FK_ItemGroup_Detail,
ISNULL((SELECT PK_SalesRep
FROM VMDWAnalytical.DBO.DIM_SalesRep
WHERE SalesRep = ST.SalesResponsible), -99) FK_SalesRep,
ISNULL((SELECT PK_SalesOrigin
FROM VMDWAnalytical.DBO.DIM_SalesOrigin
WHERE OriginID = ST.SalesOriginID), -99) FK_SalesOrigin,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_QualityCode
FROM VMDWAnalytical.dbo.DIM_QualityCode
WHERE QualityCode = RR.VMQualityCode), -99)
END FK_QualityCode,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_QualityDetailCode
FROM VMDWAnalytical.dbo.DIM_QualityDetailCode
WHERE QualityDetailCode = SL.VMQualityDetailCode
AND QualityCode = RR.VMQualityCode), -99)
END FK_QualityDetailCode,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_ResponsibilityCode
FROM VMDWAnalytical.dbo.DIM_ResponsibilityCode
WHERE ResponsibilityCode = RR.VMResponsibilityCode), -99)
END FK_ResponsibilityCode,
CASE
WHEN ST.CREATEDDATE <= DATEADD(YEAR, 2, (SELECT KPISTARTDATE FROM RDS_KPIInventTableRel WHERE ITEMID = IT.ITEMID)) THEN
(SELECT PK_NEWITEMFLAG FROM VMDWAnalytical.DBO.DIM_NewItemFlag WHERE NewItemFlag = 'NEW')
ELSE
(SELECT PK_NEWITEMFLAG FROM VMDWAnalytical.DBO.DIM_NewItemFlag WHERE NewItemFlag = 'EXISTING')
END FK_NewItemFlag,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = RR.TransDate), 1) FK_TransDate,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = RR.CreatedDate), 1) FK_CreatedDate,
ISNULL((SELECT T.TIMEKEY
FROM VMDWAnalytical.DBO.DIM_Time T
WHERE T.FullDate = RR.VMReceivedDate), 1) FK_VMReceivedDate,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_ReturnAction
FROM VMDWAnalytical.dbo.DIM_ReturnAction
WHERE ReturnActionID = RR.ReturnActionID), -99)
END FK_ReturnAction,
CASE
WHEN CIT.Qty < 0 AND RR.TransDate IS NULL THEN
-97
WHEN CIT.QTY >=0 AND RR.TransDate IS NULL THEN
-98
ELSE
ISNULL((SELECT PK_StatusCode
FROM VMDWAnalytical.dbo.DIM_StatusCode
WHERE StatusCode = RR.VMStatusCode), -99)
END FK_StatusCode,
ISNULL(CIT.InvoiceID, 'zUnknown') InvoiceID,
ISNULL(CIT.InventTransId, 'zUnknown') InventTransId,
ISNULL(CIT.ItemId, 'zUnknown') ItemId,
ISNULL(ST.SalesID, 'zUnknown') SalesID,
ISNULL(RR.VMRaNumber, 'zUnknown') VMRaNumber,
CASE
--A, Take out the Service item, flag with -98
WHEN IT.ITEMGROUPID = 'SERVICE' THEN
-98
--B, There is an original SO and the difference between the dates is non-negative
WHEN (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM), ST.CREATEDDATE) >= 0 THEN
DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM), ST.CREATEDDATE)
--C, The last 10 characters of the refnum field start with SOR, and the orig SO date is not null and the difference between the dates is non-negative
WHEN RIGHT(ST.PURCHORDERFORMNUM, 10) LIKE 'SOR%' AND (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)), ST.CREATEDDATE) >= 0 THEN
DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)), ST.CREATEDDATE)
--D, There is an original SO and the difference between the dates is negative
WHEN (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM), ST.CREATEDDATE) < 0 THEN
DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE)
--E, The last 10 characters of the refnum field start with SOR, and the orig SO date is not null, and the difference between the dates is negative
WHEN RIGHT(ST.PURCHORDERFORMNUM, 10) LIKE 'SOR%' AND (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)) IS NOT NULL
AND DATEDIFF(DAY, (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = RIGHT(ST.PURCHORDERFORMNUM, 10)), ST.CREATEDDATE) < 0 THEN
DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE)
--F, If the campaign date <> 1/1/1900 and the datediff is positive
WHEN (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID) <> '1/1/1900'
AND DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE) >= 0 THEN
DATEDIFF(DAY, (SELECT SCT.CAMPAIGNDATE FROM RDS_SMMCAMPAIGNTABLE SCT WHERE SCT.CAMPAIGNID = ST.SMMCAMPAIGNID), ST.CREATEDDATE)
--G, If the difference between the Return SO and the Return and Repair transdate is positive
WHEN DATEDIFF(DAY, ST.CREATEDDATE, RR.TRANSDATE) > 0 THEN
DATEDIFF(DAY, ST.CREATEDDATE, RR.TRANSDATE)
--H
ELSE
-97
END RETDAYS,
--RETURNS
-1 * (CASE
WHEN SL.SALESTYPE = 4 THEN
CIT.LINEAMOUNTMST
ELSE
0
END) AS ReturnLineAmount,
-1 * (CASE
WHEN SL.SALESTYPE = 4 THEN
CIT.QTY
ELSE
0
END) AS ReturnQty,
--/RETURNS
(CIT.LINEAMOUNTMST) AS LineAmountMst, --Measure
(CIT.QTY) AS Qty, --Measure
ISNULL(DATEDIFF(DAY, RR.CreatedDate, RR.TransDate), 0) ReturnDays,
ITMS.PRICE AS ListPrice --Measure
FROM RDS_CUSTINVOICETRANS CIT
LEFT JOIN RDS_CUSTINVOICEJOUR CIJ
ON CIT.INVOICEID = CIJ.INVOICEID
JOIN RDS_CUSTTABLE CT
ON CIJ.ORDERACCOUNT = CT.ACCOUNTNUM
LEFT JOIN RDS_ADDRESSCOUNTRYREGION ACR
ON CIJ.DLVCOUNTRYREGIONID = ACR.COUNTRYREGIONID
LEFT JOIN RDS_SALESTABLE ST
ON CIJ.SALESID = ST.SALESID
LEFT JOIN RDS_SALESLINE SL
ON CIT.INVENTTRANSID = SL.INVENTTRANSID
LEFT JOIN RDS_INVENTTABLE IT
ON CIT.ITEMID = IT.ITEMID
LEFT JOIN RDS_INVENTTABLEMODULE ITMS
ON IT.ITEMID = ITMS.ITEMID
AND ITMS.MODULETYPE = 2
LEFT JOIN RDS_VMRETURNANDREPAIRTABLE RR
ON SL.SALESID = RR.SALESID
AND SL.VMRANUMBER = RR.VMRANUMBER
LEFT JOIN RDS_INVENTDIM ID
ON SL.INVENTDIMID = ID.INVENTDIMID
) ABC
--WHERE SL.SALESTYPE = 4 --and (SELECT ST1.CREATEDDATE FROM RDS_SALESTABLE ST1 WHERE ST1.SALESID = ST.PURCHORDERFORMNUM) IS NULL
LEFT JOIN
(SELECT CIT.InventTransId AS InventTransId, CIT.ItemId AS ItemId, CIT.InvoiceId AS InvoiceId,
ISNULL((SELECT T.TIMEKEY
FROM VMDWANAlytical.DBO.DIM_Time T
WHERE T.FullDate = MAX(SR.ProdDate)),1) AS FK_InventSerialProdDate
FROM RDS_CustInvoiceTrans CIT
LEFT JOIN RDS_InventTrans IVT
ON CIT.InventTransId = IVT.InventTransId AND
CIT.InvoiceId = IVT.InvoiceId AND
CIT.ItemId = IVT.ItemId
LEFT JOIN RDS_INVENTDIM ID
ON IVT.InventDimId = ID.InventDimId
LEFT JOIN RDS_InventSerial SR
ON ID.InventSerialId = SR.InventSerialId AND
IVT.ItemId = SR.ItemId
GROUP BY CIT.InventTransId, CIT.ItemId, CIT.InvoiceId) ZZZ
ON ABC.InventTransId = ZZZ.InventTransId AND
ABC.ItemId = ZZZ.ItemId AND
ABC.InvoiceId = ZZZ.InvoiceId
I think you need to add an alias to the subquery so you'd have
SELECT * FROM ( MY QUERY HERE) as MyQuery