Oracle SUM function not working in Select clause - oracle

I have the attached code below in which the sum(slice) column is giving me same results even if I don't use the SUM function. Can somebody help me fix the code?
Also need the following:
Currently, it is giving output as:
Task Name Resource ID Slice Date Slice Hours
abc 123 4/1 8.50
abc 123 4/2 7.50
abc 123 4/3 8.50
I need output as:
Task Name Resource ID Slice Date Slice Hours
abc 123 4/1 – 4/30 <Total for the month>
xyz 123 4/1 – 4/30 <Total for the month>
select distinct PCF.project_code as project_id,
PCF.project_name as project_name,
RCF.resource_id,
RCF.last_name || ' ' || RCF.first_name as resource_name,
Tsh.slice_date as fact_date,
sum(tsh.slice) "Total Slice",
T.prname as TaskName,
task_info.phase_code as phase_code,
task_info.phase_name as phase_name,
task_info.task_sequence as task_outline
from prj_blb_slicerequests tsr
JOIN prj_blb_slices tsh ON tsr.id = tsh.slice_request_id
JOIN prtimeentry TE ON tsh.prj_object_id = te.prid
JOIN prtimesheet TS ON TS.prid = TE.prtimesheetid
JOIN prAssignment A ON TE.prassignmentid = A.prid
JOIN prtask T ON A.prtaskid = T.prid
JOIN nbi_resource_current_facts RCF ON TS.prresourceid = RCF.resource_id
JOIN nbi_project_current_facts PCF ON T.prprojectid = PCF.project_id
JOIN prj_projects PP ON PCF.project_id = PP.prid
JOIN (select task_id, phase_code, phase_name, task_name, task_sequence from cust_phase_rollup_v) task_info ON T.prid = task_info.task_id
where tsr.request_name = 'Daily Timeentry Actuals'
and tsh.slice > 0
and ts.prstatus < 5
and tsh.slice_date >= to_date('1-MAY-14')
and tsh.slice_date <= to_date('31-MAY-14')
group by project_code, project_name, resource_id, RCF.last_name || ' ' || RCF.first_name, Tsh.slice_date, T.prname, task_info.phase_code,
task_info.phase_name, task_info.task_sequence
order by project_id

2 problems:
You want results per month, not per day, so instead of just selecting the slice_date, you should convert that into month/year format.
To use an aggregate function, you need a corresponding group by in your query. You should group by all of the other columns you're selecting.
This should work (untested, though):
select distinct PCF.project_code as project_id,
PCF.project_name as project_name,
RCF.resource_id,
RCF.last_name || ' ' || RCF.first_name as resource_name,
to_char(Tsh.slice_date, 'mm/yyyy') as fact_date,
sum(tsh.slice) "Total Slice",
T.prname as TaskName,
task_info.phase_code as phase_code,
task_info.phase_name as phase_name,
task_info.task_sequence as task_outline
from prj_blb_slicerequests tsr
JOIN prj_blb_slices tsh ON tsr.id = tsh.slice_request_id
JOIN prtimeentry TE ON tsh.prj_object_id = te.prid
JOIN prtimesheet TS ON TS.prid = TE.prtimesheetid
JOIN prAssignment A ON TE.prassignmentid = A.prid
JOIN prtask T ON A.prtaskid = T.prid
JOIN nbi_resource_current_facts RCF ON TS.prresourceid = RCF.resource_id
JOIN nbi_project_current_facts PCF ON T.prprojectid = PCF.project_id
JOIN prj_projects PP ON PCF.project_id = PP.prid
JOIN (select task_id, phase_code, phase_name, task_name, task_sequence from cust_phase_rollup_v) task_info ON T.prid = task_info.task_id
where tsr.request_name = 'Daily Timeentry Actuals'
and tsh.slice > 0
and ts.prstatus < 5
and tsh.slice_date >= to_date('1-MAY-14')
and tsh.slice_date <= to_date('31-MAY-14')
group by PCF.project_code,
PCF.project_name,
RCF.resource_id,
RCF.last_name || ' ' || RCF.first_name,
to_char(Tsh.slice_date, 'mm/yyyy'),
T.prname,
task_info.phase_code,
task_info.phase_name,
task_info.task_sequence
order by PCF.project_code

Related

why SSRS asking to Define query parameters when already defined?

I have the below query which is working well in SQL. But when I use this query in ssrs(Visual studio 2015) it is giving me error saying define query parameters. I have already defined values for parametes but still getting the error. I feel something from the SQL query which s not getting supported in SSRS. Can anyone help?
[![SET FMTONLY OFF
USE GODSDB
declare
#start date = getdate() - 100
, #end date = getdate()
drop table #CallLog
declare #code varchar(max), #TableName varchar(max), #SeverName varchar(max)
--IF object_id('tempdb..#CallLog') IS NOT NULL DROP TABLE #CallLog
CREATE TABLE #CallLog (
\[JurisdictionShortIdentifier\] VARCHAR(100),
\[ContractCallLogOID\] INT,
\[ContractCallLogProcessQueueOID\] INT,
\[ContractOID\] INT,
\[CallDate\] DATETIME,
\[CallHandledBy\] VARCHAR(60),
\[CallLogOldGreenUnit\] INT,
\[CallLogNewGreenUnit\] INT,
\[Comment\] VARCHAR(7500)
)
set #TableName = '#CallLog'
set #SeverName = 'BA_GBASSTOCSISDB' -- sp_linkedservers
set #code = '
;with XMLNAMESPACES(DEFAULT ''http://tempuri.org/GEOUnit.xsd'')
select
ccl.JurisdictionShortIdentifier,
ccl.ContractCallLogOID,
que.ContractCallLogProcessQueueOID,
ccl.ContractOID,
ccl.db_insertDate as CallDate,
ccl.db_insertBy as CallHandledBy,
convert(xml, que.XMLString).value(''(/GEOUnit/GreenPowerUnits/GreenPowerUnitsOld)\[1\]'',''int'') as CallLogOldGreenUnit,
convert(xml, que.XMLString).value(''(/GEOUnit/GreenPowerUnits/GreenPowerUnitsNew)\[1\]'',''int'') as CallLogNewGreenUnit,
cmt.Comment
from CSISDB.dbo.ContractCallLog as ccl (nolock)
left join CSISDB.dbo.ContractCallLogProcessQueue as que (nolock) on ccl.ContractCallLogOID = que.ContractCallLogOID
left join CSISDB.dbo.Comment as cmt (nolock) on ccl.ContractCallLogOID = cmt.FKObjectOID and cmt.FKTableObjectOID = 1008
where 1 = 1
and ccl.ContractCallLogStatusIdentifier in (''GMOD'', ''GUS'', ''GI'')
and ccl.ContractCallLogReasonIdentifier in (''Changed'', ''GEOR'', ''NULL'', ''GEO'', ''GEO0'', ''GEO1'', ''GEO3'', ''GEO2'', ''CDR'', ''GEO4'', ''GEO5'', ''JUST GREEN adder'', ''JustGreen'')
--and ccl.JurisdictionShortIdentifier = ''AG''
and ccl.SourceSystemIdentifier = ''GBASS''
and ccl.db_insertDate between #start and #end
--and ccl.ContractCallLogOID = 57131879 --> TEST CASE
'
set #code = replace(#code, '#start', '''' + convert(varchar, convert(date, #start, 101)) + '''')
set #code = replace(#code, '#end', '''' + convert(varchar, convert(date, dateadd(day, 1, #end), 101)) + '''')
set #code = concat('insert into ', #TableName, ' select * from openquery (', #SeverName, ', ''' , replace(#code, '''', '''''') , ''')')
print #code
exec(#code)
-- select * from #CallLog where ContractCallLogOID = 57707501
-- some call log have multiple process queues, delete the process queues that don't is not modifying the geo units
delete a
from #CallLog as a
inner join #CallLog as b on a.ContractCallLogOID = b.ContractCallLogOID
and a.ContractCallLogProcessQueueOID != b.ContractCallLogProcessQueueOID
and a.CallLogNewGreenUnit is null
and b.CallLogNewGreenUnit is not null
--select * from #CallLog
select
ccl.JurisdictionShortIdentifier,
ccl.ContractCallLogOID,
ccl.ContractCallLogProcessQueueOID,
cnt.RtlrContractIdentifier,
ccl.ContractOID,
cst.ContractStatusIdentifier as ContractStatus,
ccl.CallLogOldGreenUnit,
ccl.CallLogNewGreenUnit,
cur.GreenLevelIndicator as CurrentGreenUnit,
cur.db_insertDate as GreenUnitLastUpdateDate,
cur.db_insertBy as GreenUnitLastUpdateBy,
ccl.CallDate,
ccl.CallHandledBy,
ccl.Comment
from #CallLog as ccl
inner join Contract as cnt (nolock) on ccl.ContractOID = cnt.ContractOID
and ccl.CallLogOldGreenUnit != ccl.CallLogNewGreenUnit
inner join ContractState as cst (nolock) on cnt.ContractOID = cst.ContractOID
left join ContractGreenContent as cur (nolock) on cnt.ContractOID = cur.ContractOID
and isnull(cur.EffectiveEndDate, dateadd(day, 1, getdate())) >= getdate()
left join ContractGreenContent as his (nolock) on cnt.ContractOID = his.ContractOID
and ccl.CallLogNewGreenUnit = his.GreenLevelIndicator
and his.db_insertDate between dateadd(day, -1, ccl.CallDate) and dateadd(day, 1, ccl.CallDate)
where his.ContractGreenContentOID is null
--select * from #CallLog
union all
select
ccl.JurisdictionShortIdentifier,
ccl.ContractCallLogOID,
ccl.ContractCallLogProcessQueueOID,
cnt.RtlrContractIdentifier,
ccl.ContractOID,
cst.ContractStatusIdentifier as ContractStatus,
ccl.CallLogOldGreenUnit,
ccl.CallLogNewGreenUnit,
cur.GreenLevelIndicator as CurrentGreenUnit,
cur.db_insertDate as GreenUnitLastUpdateDate,
cur.db_insertBy as GreenUnitLastUpdateBy,
ccl.CallDate,
ccl.CallHandledBy,
ccl.Comment
from #CallLog as ccl
inner join Contract as cnt (nolock) on ccl.ContractOID = cnt.ContractOID
and isnull(ccl.CallLogOldGreenUnit, 0) = isnull(ccl.CallLogNewGreenUnit, 0)
inner join ContractState as cst (nolock) on cnt.ContractOID = cst.ContractOID
left join ContractGreenContent as cur (nolock) on cnt.ContractOID = cur.ContractOID
and isnull(cur.EffectiveEndDate, dateadd(day, 1, getdate())) >= getdate()
SET FMTONLY ON][1]][1]
Make sure your parameter names and SQL variables are all spelled exactly the same, they are case sensitive.
Also try declaring each variable on it own line with its own DECLARE statement. I've seen this fix this issue 'sometimes'
Your parameters are inside your #SQL query variable. The server that you are running the OPENQUERY from doesn't recognize the parameters since they were declared on another server.
Put the parameter declarations inside your SQL variable:
set #code = '
declare
#start date = getdate() - 100
, #end date = getdate()
...

Query to find Index bloat

I need a query to find whether index bloat on a table. I saw some queries where they are comparing table size with index size. If there is any other approach, please share the query.
I am using Greenplum 4.3 (which is based Postgres 8.2)
Bloat Score Query
The following SQL query will examine each table in the XML schema and identify dead rows (tuples) that are wasting disk space.
SELECT schemaname || '.' || relname as tblnam,
n_dead_tup,
(n_dead_tup::float / n_live_tup::float) * 100 as pfrag
FROM pg_stat_user_tables
WHERE schemaname = 'xml' and n_dead_tup > 0 and n_live_tup > 0 order by pfrag desc;
If this query returns a high percentage ( pfrag ) of dead tuples, the VACUUM command may be used to reclaim space.
7 Considered to be high
From wiki.postgres.org
SELECT
current_database(), schemaname, tablename, /*reltuples::bigint, relpages::bigint, otta,*/
ROUND((CASE WHEN otta=0 THEN 0.0 ELSE sml.relpages::float/otta END)::numeric,1) AS tbloat,
CASE WHEN relpages < otta THEN 0 ELSE bs*(sml.relpages-otta)::BIGINT END AS wastedbytes,
iname, /*ituples::bigint, ipages::bigint, iotta,*/
ROUND((CASE WHEN iotta=0 OR ipages=0 THEN 0.0 ELSE ipages::float/iotta END)::numeric,1) AS ibloat,
CASE WHEN ipages < iotta THEN 0 ELSE bs*(ipages-iotta) END AS wastedibytes
FROM (
SELECT
schemaname, tablename, cc.reltuples, cc.relpages, bs,
CEIL((cc.reltuples*((datahdr+ma-
(CASE WHEN datahdr%ma=0 THEN ma ELSE datahdr%ma END))+nullhdr2+4))/(bs-20::float)) AS otta,
COALESCE(c2.relname,'?') AS iname, COALESCE(c2.reltuples,0) AS ituples, COALESCE(c2.relpages,0) AS ipages,
COALESCE(CEIL((c2.reltuples*(datahdr-12))/(bs-20::float)),0) AS iotta -- very rough approximation, assumes all cols
FROM (
SELECT
ma,bs,schemaname,tablename,
(datawidth+(hdr+ma-(case when hdr%ma=0 THEN ma ELSE hdr%ma END)))::numeric AS datahdr,
(maxfracsum*(nullhdr+ma-(case when nullhdr%ma=0 THEN ma ELSE nullhdr%ma END))) AS nullhdr2
FROM (
SELECT
schemaname, tablename, hdr, ma, bs,
SUM((1-null_frac)*avg_width) AS datawidth,
MAX(null_frac) AS maxfracsum,
hdr+(
SELECT 1+count(*)/8
FROM pg_stats s2
WHERE null_frac<>0 AND s2.schemaname = s.schemaname AND s2.tablename = s.tablename
) AS nullhdr
FROM pg_stats s, (
SELECT
(SELECT current_setting('block_size')::numeric) AS bs,
CASE WHEN substring(v,12,3) IN ('8.0','8.1','8.2') THEN 27 ELSE 23 END AS hdr,
CASE WHEN v ~ 'mingw32' THEN 8 ELSE 4 END AS ma
FROM (SELECT version() AS v) AS foo
) AS constants
GROUP BY 1,2,3,4,5
) AS foo
) AS rs
JOIN pg_class cc ON cc.relname = rs.tablename
JOIN pg_namespace nn ON cc.relnamespace = nn.oid AND nn.nspname = rs.schemaname AND nn.nspname <> 'information_schema'
LEFT JOIN pg_index i ON indrelid = cc.oid
LEFT JOIN pg_class c2 ON c2.oid = i.indexrelid
) AS sml
ORDER BY wastedbytes DESC

ORA-01427: Subquery returns more than one row

When I execute the query below, I get the message like this: "ORA-01427: Sub-query returns more than one row"
Define REN_RunDate = '20160219'
Define MOP_ADJ_RunDate = '20160219'
Define RID_RunDate = '20160219'
Define Mbr_Err_RunDate = '20160219'
Define Clm_Err_RunDate = '20160219'
Define EECD_RunDate = '20160219'
select t6.Member_ID, (Select 'Y' from MBR_ERR t7 where t7.Member_ID = t6.Member_ID and t7.Rundate = &Mbr_Err_RunDate ) Mbr_Err,
NVL(Claim_Sent_Amt,0) Sent_Claims, Rejected_Claims,Orphan_Claim_Amt,Claims_Accepted, MOP_Adj_Sent Sent_MOP_Adj,Net_Sent,
(Case
When Net_Sent < 45000 then 0
When Net_Sent > 25000 then 20500
Else
Net_Sent - 45000
End
)Net_Sent_RI,
' ' Spacer,
Total_Paid_Claims CMS_Paid_Claims, MOP_Adjustment CM_MOP_Adj, MOP_Adjusted_Paid_claims CM_Net_Claims, Estimated_RI_Payment CM_RI_Payment
from
(
select NVL(t3.Member_ID,t5.Member_ID)Member_ID, t3.Claim_Sent_Amt, NVL(t4.Reject_Claims_Amt,0) Rejected_Claims, NVL( t8.Orphan_Amt,0) Orphan_Claim_Amt,
(t3.Claim_Sent_Amt - NVL(t4.Reject_Claims_Amt,0) - NVL(t8.Orphan_Amt,0)) Claims_Accepted,
NVL(t2.MOP_Adj_Amt,0) MOP_Adj_Sent ,
( (t3.Claim_Sent_Amt - NVL(t4.Reject_Claims_Amt,0)) - NVL(t2.MOP_Adj_Amt,0) - NVL(t8.Orphan_Amt,0) ) Net_Sent,
t5.Member_ID CMS_Mbr_ID,t5.Total_Paid_Claims,t5.MOP_Adjustment, t5.MOP_Adjusted_Paid_Claims, t5.Estimated_RI_Payment
From
(
Select t1.Member_ID, Sum( t1.Paid_Amount) Claim_Sent_Amt
From RENS t1
where t1.rundate = &REN_RunDate
group by t1.Member_ID
) t3
Left Join MOP_ADJ t2
on (t3.Member_ID = t2.Member_ID and t2.rundate = &MOP_ADJ_RunDate)
Left Join
(select Member_ID, sum(Claim_Total_Paid_Amount) Reject_Claims_Amt from CLAIM_ERR
where Rundate = &Claim_Err_RunDate
and Claim_Total_Paid_Amount != 0
Group by member_ID
)t4
on (t4.Member_ID = t3.Member_ID )
Full Outer Join
(
select distinct Member_ID,Total_Paid_Claims,MOP_Adjustment,MOP_Adjusted_Paid_Claims, Estimated_RI_Payment
from RID
where Rundate = &RID_RunDate
and Estimated_RI_Payment != 0
)t5
On(t5.Member_ID = t3.Member_ID)
Left Outer Join
(
select Member_ID, Sum(Claim_Paid_Amount) Orphan_Amt
From EECD
where RunDate = &EECD_RunDate
group by Member_ID
)t8
On(t8.Member_ID = t3.Member_ID)
)t6
order by Member_ID
You have this expression among the select columns (at the top of your code):
(Select 'Y' from MBR_ERR t7 where t7.Member_ID = t6.Member_ID
and t7.Rundate = &Mbr_Err_RunDate ) Mbr_Err
If you want to select the literal 'Y', then just select 'Y' as Mbr_Err. If you want to select either 'Y' or null, depending on whether the the subquery returns exactly one row or zero rows, then write it that way.
I suspect this subquery (or perhaps another one in your code, used in a similar way) returns more than one row - in which case you will get exactly the error you got.

How to join output of two queries

Good morning.
I need help.
I have this code:
select A.AREA_CODE, A.OUTLET_NAME, SUM(B.AMOUNT) as NETSALES
from M_OUTLET A, T_SALES_DETAIL B
where A.OUTLET_NO = B.OUTLET_NO and A.OUTLET_TYPE_DESC not
like '%head%' and A.OUTLET_TYPE_DESC not like '%prod%' and
A.OUTLET_TYPE_DESC not like '%stor%'
and B.SYSTEM_DATE between CONVERT (datetime, '3/1/2014')
and CONVERT (datetime, '3/31/2014')
and B.VOID = 'N' group by A.AREA_CODE , A.OUTLET_NAME order by A.AREA_CODE
and this is the output:
AREA_CODE OUTLET_NAME NETSALES
1 MAKATI BU CAFE 2 226202.52
2 MAKATI BU CART 170305.01
The other code is this:
SELECT A.AREA_CODE, SUM (C.AMOUNT) AS E_SALES
FROM E_SALES_DETAIL C , M_OUTLET A
WHERE C.SYSTEM_DATE
between CONVERT (datetime, '3/1/2014') and
CONVERT (datetime, '3/31/2014') and C.VOID = 'N'
GROUP BY A.AREA_CODE ORDER BY A.AREA_CODE
and the output is:
AREA_CODE E_SALES
1 22208347.35
2 14453051.45
My question is, how can I join this codes to get this output:
AREA_CODE OUTLET_NAME E_SALES NETSALES
1 MAKATI BU CAFE 2 22208347.35 226202.52
2 MAKATI BU CART 14453051.45 170305.01
Thank you.
The easiest way is to use your two queries as subqueries. That said, I think you are missing a join condition on the second subquery:
select ab.area_code. ab.outlet_name, ab.netsales, ac.e_sales
from (select A.AREA_CODE, A.OUTLET_NAME, SUM(B.AMOUNT) as NETSALES
from M_OUTLET A join
T_SALES_DETAIL B
on A.OUTLET_NO = B.OUTLET_NO
where A.OUTLET_TYPE_DESC not like '%head%' and
A.OUTLET_TYPE_DESC not like '%prod%' and
A.OUTLET_TYPE_DESC not like '%stor%' and
B.SYSTEM_DATE between CONVERT(datetime, '3/1/2014') and CONVERT(datetime, '3/31/2014') and
B.VOID = 'N'
group by A.AREA_CODE, A.OUTLET_NAME
) ab join
(SELECT A.AREA_CODE, SUM(C.AMOUNT) AS E_SALES
FROM E_SALES_DETAIL C join
M_OUTLET A
ON ????
WHERE C.SYSTEM_DATE between CONVERT(datetime, '3/1/2014') and CONVERT(datetime, '3/31/2014') and
C.VOID = 'N'
GROUP BY A.AREA_CODE
) ac
on ab.area_code ac.area_code;

How to write Count, Distinct in LINQ from Oracle

I have a query in Oracle which i am trying to convert into linq. I think I am almost there. Here is the query in Oracle. I had quick problem with left outer joins in the query. Please consider this too in the question. My main problem is I can't write using this count, distinct for different columns in the table.
SELECT COUNT(DISTINCT claimant_id || rqst_wk_dt || claim_id) AS no_of_weeks_compensated
, SUM(pmt_am) AS total_payments
, COUNT(DISTINCT claimant_id || claim_id)
FROM (SELECT c.claimant_id
, c.claim_id
, c.rqst_wk_dt
, a.pmt_am
FROM ui_mon_hdr d
INNER JOIN ui_rqst_wk_ctrl c
ON d.claimant_id = c.claimant_id
AND d.claim_id = c.claim_id
LEFT OUTER JOIN ui_dstb_pmt a
ON c.claimant_id = a.claimant_id
AND c.claim_id = a.claim_id
AND c.rqst_wk_dt = a.rqst_wk_dt
AND a.rcpnt_id = 'CLMNT'
LEFT OUTER JOIN ui_claim_pmt b
ON c.claimant_id = b.claimant_id
AND c.claim_id = b.claim_id
AND warrant_dt BETWEEN '1 June 2011' AND '30 June 2011'
AND b.status_cd = 'PAID'
AND a.rcpnt_id = b.rcpnt_id --AND A.PMT_NU = B.PMT_NU
LEFT OUTER JOIN ui_auth_pmt e
ON c.claimant_id = e.claimant_id
AND c.claim_id = e.claimant_id
AND c.rqst_wk_dt = e.rqst_wk_dt
AND d.mon_seq_nu = e.mon_seq_nu
WHERE c.rqst_wk_dt BETWEEN '1 June 2011' AND '30 June 2011'
AND d.bspd_type_cd = 'ALTR')
Above is the query which I have in Oracle and run in TOAD. Below is the query in LINQ. I have just done internal select statement and I wonder how to implement the select count and distinct for the query:
var enddate = Convert.ToDateTime("6/30/2011");
var Altquery = from D in UiMonHdr
join C in UiRqstWkCtrl on new {D.ClaimantId, D.ClaimId} equals new {C.ClaimantId, C.ClaimId}
join A in UiDstbPmt on new {C.ClaimantId, C.ClaimId , C.RqstWkDt} equals new {A.ClaimantId, A.ClaimId, A.RqstWkDt}
where A.RcpntId.Contains("CLMNT")
join B in UiClaimPmt on new {C.ClaimantId, C.ClaimId, A.RcpntId} equals new {B.ClaimantId, B.ClaimId, B.RcpntId}
where B.StatusCd.Contains("PAID") && B.WarrantDt >= startdate && B.WarrantDt <= enddate
join E in UiAuthPmt on new {C.ClaimantId, C.ClaimId , C.RqstWkDt} equals new {E.ClaimantId, E.ClaimId, E.RqstWkDt}
where C.RqstWkDt >= startdate && C.RqstWkDt <= enddate && D.BspdTypeCd.Contains("ALTR")
select new {ClaimantId = C.ClaimantId, ClaimId = C.ClaimId, PmtAmt = A.PmtAm, RqstWkDt = C.RqstWkDt}; Altquery.Dump();

Resources