Max in a single query
how i can write in a single query from 2 following for get max value?
SELECT NVL(MAX(number1),0)+1 INTO max1 FROM table1
WHERE TO_NUMBER(tO_CHAR(DATA1,'YYYY')) = ANNOX;
SELECT NVL(MAX(N_number1),0)+1 iNTO max2 FROM table2
WHERE TO_NUMBER(tO_CHAR(DATA2,'YYYY')) = ANNOX
AND tipo = 'xx';
for example:
IF max1 > max2 then
myvar := max1
ELSE
myvar := max2
END IF;
thanks for help
Try this.
SELECT greatest(NVL(MAX(a.number1),0)+1, NVL(MAX(b.N_number1),0)+1) value
INTO max1
FROM table1 a
,table2 b
WHERE TO_NUMBER(tO_CHAR(a.DATA1,'YYYY')) = TO_NUMBER(tO_CHAR(b.DATA2,'YYYY'))
and TO_NUMBER(tO_CHAR(a.DATA1,'YYYY')) = ANNOX
AND b.tipo = 'xx';
not tested
Cheers
Sarma.
Similar Messages
-
How to use multiple aggregate functions in single query
hi to all
The output will be giving first_name,last_name,max(salary),min(salary) and the output will be department wise.From employees table in single query
output will be:
first_name|last_name|max(salary)|min(salary)SELECT first_name||' '||last_name as ename,
MIN(sal) KEEP (DENSE_RANK FIRST ORDER BY sal) OVER (PARTITION BY deptno) "Lowest",
MAX(sal) KEEP (DENSE_RANK LAST ORDER BY sal) OVER (PARTITION BY deptno) "Highest"
FROM emp
ORDER BY deptno, sal;Edited by: Ramio on Jan 10, 2012 10:43 PM -
How to calculate multiple aggregation in a single query
how to find firstname ,lastname for max and min salary from employees table group by department in a single query?
Edited by: Gnanasekar on Jan 10, 2012 6:36 AMcheck this query
select ENAME,SAL
from EMP
where SAL in(select max(SAL)
from EMP
group by DEPTNO)
or SAL in(select min(SAL)
from EMP
group by DEPTNO)Hope this will help you..
You should ask this question at sql/plsql forum
If someone's response is helpful or correct, please mark it accordingly. -
Update table all null values to 0 single query
hi dear ;
How Can I do , update table all null values to 0 using single query or proceduredeclare @tableName nvarchar(100)
declare @querys varchar(max)
set @querys = ''
set @tableName = 'YOUR TABLE NAME HERE'
select @querys = @querys + 'update ' + @tableName + ' set ' +
QUOTENAME(t.[name]) + '=0 where ' + QUOTENAME(t.[name]) + ' is null;'
from (SELECT [name] FROM syscolumns
WHERE id = (SELECT id
FROM sysobjects
WHERE type = 'U'
AND [NAME] = @tableName))t
select @querys
execute sp_executesql @sqlQuery
Reference:
http://stackoverflow.com/questions/6130133/sql-server-update-all-null-field-as-0
-Vaibhav Chaudhari
this code is return update TABLE set [FIELD]=isnull([FIELD],''),update TABLE set [FIELD2]=isnull([FIELD2],'')
I want to use UPDATE TABLE SET FIELD1=ISNULL(FIELD1,0),FIELD2=ISNULL(FIELD2,0),FIELD3=ISNULL(FIELD3,0) So CUT another update and set statement . -
Return two values for one site in single query
Oracle 10g on Solaris 10
data:
value integer
date timestamp
This query works as is:
WITH vals AS
(SELECT start_date_time,
value
FROM r_base a,
hdb_site_datatype b,
hdb_site c,
hdb_datatype d
WHERE a.site_datatype_id = b.site_datatype_id
AND a.interval = 'day'
AND b.site_id = c.site_id
AND c.site_common_name = 'CABALLO'
AND b.datatype_id = d.datatype_id
AND d.datatype_common_name = 'pool elevation'
AND a.start_date_time > a.start_date_time - 367)
SELECT x.start_date_time,
x.VALUE,
y.start_date_time,
y.VALUE AS valuem1w,
z.start_date_time,
z.VALUE AS valuem1dm1y
FROM vals x,
vals y,
vals z
WHERE y.start_date_time(+) = x.start_date_time - 7
AND z.start_date_time(+) = ADD_MONTHS (x.start_date_time-1,-12)
AND x.start_date_time = TO_DATE('07-JAN-2008','DD-MON-YYYY');
and this query works:
WITH vals AS
(SELECT start_date_time,
value
FROM r_base a,
hdb_site_datatype b,
hdb_site c,
hdb_datatype d
WHERE a.site_datatype_id = b.site_datatype_id
AND a.interval = 'day'
AND b.site_id = c.site_id
AND c.site_common_name = 'CABALLO'
AND b.datatype_id = d.datatype_id
AND d.datatype_common_name = 'storage'
AND a.start_date_time > a.start_date_time - 367)
SELECT x.start_date_time,
x.VALUE,
y.start_date_time,
y.VALUE AS valuem1w,
z.start_date_time,
z.VALUE AS valuem1dm1y
FROM vals x,
vals y,
vals z
WHERE y.start_date_time(+) = x.start_date_time - 7
AND z.start_date_time(+) = ADD_MONTHS (x.start_date_time-1,-12)
AND x.start_date_time = TO_DATE('07-JAN-2008','DD-MON-YYYY');
I need it to return storage and pool elevation in a single query instead of two queries.
The results should be:
current day, elevation_value; current day minus 1 week, elevation_value; current day minus 1 day minus 1 year, elevation_value; current day, storage_value; current day minus 1 week, storage_value; current day minus 1 day minus 1 year, storage_value
Thanks
Very, very much appreciate if you can show me how to do this..something like this, perhaps? (untested, as I don't have your data):
WITH date_param as (select TO_DATE('07-JAN-2008','DD-MON-YYYY') p_date from dual),
SELECT max(nvl(case when d.datatype_common_name = 'pool elevation'
and a.start_date_time = p_date then value
end)) elevation_curr_day_val,
max(nvl(case when d.datatype_common_name = 'pool elevation'
and a.start_date_time = p_date-7 then value
end)) elevation_last_week_val,
max(nvl(case when d.datatype_common_name = 'pool elevation'
and a.start_date_time = add_months(p_date-1, -12) then value
end)) elevation_last_year_val,
max(nvl(case when d.datatype_common_name = 'storage'
and a.start_date_time = p_date then value
end)) storage_curr_day_val,
max(nvl(case when d.datatype_common_name = 'storage'
and a.start_date_time = p_date-7 then value
end)) storage_last_week_val,
max(nvl(case when d.datatype_common_name = 'storage'
and a.start_date_time = add_months(p_date-1, -12) then value
end)) storage_last_year_val
FROM r_base a,
hdb_site_datatype b,
hdb_site c,
hdb_datatype d
WHERE a.site_datatype_id = b.site_datatype_id
AND a.interval = 'day'
AND b.site_id = c.site_id
AND c.site_common_name = 'CABALLO'
AND b.datatype_id = d.datatype_id
AND d.datatype_common_name in ('pool elevation', 'storage')
AND a.start_date_time in (p_date, p_date-7, add_months(p_date-1, -12)); -
Hello to all
I have the following trigger
SELECT COUNT(*) INTO ESISTE FROM A_PAZIENTI_NPRELIEVO PNP
WHERE K_CODE = :new.K_CODE
AND ANNO = :new.ANNO
AND TIPORD = :new.TIPORD
AND DATA_R = TRUNC(:new.DATA_PRENOTATA);
IF ESISTE = 0 THEN
SELECT NVL(LPAD(TO_CHAR(MAX(to_number(substr(NPRELIEVO,8,3))) + 1),3,'0'),'001')
INTO NPRELIEVOC
FROM A_PAZIENTI_NPRELIEVO
WHERE K_CODE = :new.K_CODE
AND ANNO = :new.ANNO
AND TIPORD = :new.TIPORD
AND DATA_R = TRUNC(:new.DATA_PRENOTATA);
NPRELIEVOT := TO_CHAR(:new.ANNO)||to_char(TRUNC(:new.DATA_PRENOTATA),'DDD') ||NPRELIEVOC;
insert into A_PAZIENTI_NPRELIEVO VALUES (:new.K_CODE,:new.TIPORD,:new.ANNO,TRUNC(:new.DATA_PRENOTATA),NPRELIEVOT);
END IF;How can I change to create a single query that is, no two select (first to see if exist and second for get max)
a kind of
Insert into from
select
Thanks for any helpBoneist wrote:
ETA: emoticon issues? What issues?! *{;-)You mean we've all got to start wearing hats?
{|:-) -
How to get this with Single query
Friends
I am sure using SQL analytical function, the following can be achieved using a single query:
Date_value | Cust_id | Customer_tenue | avg_bal
01-aug-09 | 111 | 0 | 1000
01-aug-09 | 112 | 1 | 2000
01-aug-09 | 113 | 2 | 900
01-aug-09 | 114 | 3 | 1250
01-sep-09 | 111 | 1 | 1200
01-sep-09 | 112 | 2 | 2000
01-sep-09 | 113 | 3 | 1900
01-sep-09 | 114 | 4 | 1250
01-oct-09 | 111 | 2 | 1100
01-oct-09 | 112 | 3 | 2200
01-oct-09 | 113 | 4 | 1900Expected result
If customer’s tenure is 0 then mark as ‘New’,
If customer’s balance is increased from last month then mark as ‘Augment’
If customer’s balance is same as last month then mark as ‘Maintain’
If customer’s balance is decreased from last month then mark as ‘Diminish’
Else ‘Left’
Help please....If customer’s tenure in last month is 0 then mark as ‘New’,There's not such case in test data... last month is October, isn't it?
SQL> with t as (select DATE '2009-08-01' Date_value, 111 Cust_id, 0 Customer_tenue, 1000 avg_bal from dual union all
2 select DATE '2009-08-01', 112 , 1 , 2000 from dual union all
3 select DATE '2009-08-01', 113 , 2 , 900 from dual union all
4 select DATE '2009-08-01', 114 , 3 , 1250 from dual union all
5 select DATE '2009-09-01', 111 , 1 , 1200 from dual union all
6 select DATE '2009-09-01', 112 , 2 , 2000 from dual union all
7 select DATE '2009-09-01', 113 , 3 , 1900 from dual union all
8 select DATE '2009-09-01', 114 , 4 , 1250 from dual union all
9 select DATE '2009-10-01', 111 , 2 , 1100 from dual union all
10 select DATE '2009-10-01', 112 , 3 , 2200 from dual union all
11 select DATE '2009-10-01', 113 , 4 , 1900 from dual)
12 select date_value, cust_id, avg_bal, oldbal, case when Customer_tenue=0 and nextbal is null then 'NEW'
13 when oldbal<avg_bal then 'Augment'
14 when oldbal=avg_bal then 'Maintain'
15 when oldbal>avg_bal then 'Diminish'
16 else 'Left' end status
17 from (select date_value, cust_id, customer_tenue, avg_bal, LEAD(avg_bal) over (partition by cust_id order by date_value desc) oldbal,
18 LAG(avg_bal) over (partition by cust_id order by date_value desc) nextbal
19 from t)
20 order by cust_id, date_value;
DATE_VALU CUST_ID AVG_BAL OLDBAL STATUS
01-AGO-09 111 1000 Left
01-SET-09 111 1200 1000 Augment
01-OTT-09 111 1100 1200 Diminish
01-AGO-09 112 2000 Left
01-SET-09 112 2000 2000 Maintain
01-OTT-09 112 2200 2000 Augment
01-AGO-09 113 900 Left
01-SET-09 113 1900 900 Augment
01-OTT-09 113 1900 1900 Maintain
01-AGO-09 114 1250 Left
01-SET-09 114 1250 1250 Maintain
Selezionate 11 righe.Max
[My Italian Oracle blog|http://oracleitalia.wordpress.com/2009/12/29/estrarre-i-dati-in-formato-xml-da-sql/] -
How to use multiple hierarchies for a single char in single query
Hi,
Is there any way that we can use multiple hierarchies for a single char in single query. I tried and it just allows me to select one hierarchy even if I use hierarchy variable.
I have a requirement where user wants to see information related to a cost center with different cost center groups in different hierarchies (every year has different cost center group hierarchies).
Suppose I want to see information related to a cost center from year 2001-2004.in these four year cost center may have been associated to different groups depending upon that year hierarchy. How can I do that?
Thanks
JonaNope. Now way to do this.
There is always just one hierarchy assigned to a characteristic. And even if the hierarchy was time dependent, it only reads it for one key date and not according to transaction data.
Regards,
Beat -
Multiple databases in a single query
I need to query multiple databases in a single query.
e.g.
Database d1 contains table t1 with column id
Database d2 contains table t2 with column id
I need a query like
SELECT * FROM t1, t2 WHERE t1.id = t2.id;
is this possible in jdbc? if yes can anyone help with some sample code?
thanks,
Ashish SarafIt is not possible using the JDBC API to query tables in two or more databases using a single query. The reason is that a JDBC Connection is made to a single data source.
However, some databases support the idea of federations or linked tables. What you do is inside the database manager link or federate a table that is present in another DBMS. Then, pose a single JDBC query to the one DBMS which will have its own table and links to the external tables.
Another approach is to use a special JDBC driver with a built-in integration engine that will perform a query across multiple databases. In effect, the system poses separate queries to the different databases and integrates and joins the data together for you automatically on the client-side. That is much easier than doing it yourself in code, but that is also possible for simple queries.
As part of my research program, we have released a shareware version of the UnityJDBC driver that can query multiple databases using a single SQL query. For more information, see:
http://www.unityjdbc.com
http://www.cs.uiowa.edu/~rlawrenc/research/projects.html
Sincerely,
Dr. Ramon Lawrence
Assistant Professor
Department of Computer Science
University of Iowa
[email protected] -
Populate Multiple Items bundled in a single query
Hello,
I am trying to create a report in which I have mulitple items that I want to populate. All of these use the same query but use different rows in the query to populate themselves. My question is:-
Is there a way to bundle the item assignment into a single query and populate the items from there? I want to reduce the time it takes for me to display the report and just hit the database once instead.Hi there,
when u say report, i think its a more of a page showing few items on a region whose values are populated from Database rather than a SQL report which will not have any items. Is that correct?
yes, multiple items of a page can be assigned values at once.
assume: P1_ITEM1,P1_ITEM2,P1_ITEM3,P1_ITEM4 are different items on a page, an "On-Load Before Header" PL/SQL process can be created to assign values to the items in this way:
SELECT tab.col1,tab.col2,tab.col3,tab.col4 INTO :P1_ITEM1,:P1_ITEM2,:P1_ITEM3,:P1_ITEM4 FROM TABLE tab;
Item "Source Used" should be of type: Only When Current Value in session state is null
Source Type: PL/SQL Expression or function
and Source Value or EXpression should be some thing like this :P1_ITEM1
Hope this helps.
Edited by: Chaitu_Apex on Mar 10, 2010 2:43 PM -
How to make the query in one single query? No Union please....
Hi,
I have sets of around 18 queries which is finding counts in many scenarios. I wanted to have a single query for this. which diplays the result in a single row.Is there a way , I heared analytical functions are good options ,but I am new to Oracle . Please help me.
select count(*) total_count from emp; --100
select coun(*) MGR_count from emp where job='MGR'-- 10
select count(*) dept_count from emp where deptno in(10 ,20)-- 75
output..
TOTAL_COUNT MGR_COUNT DEPT_COUNT
100 10 75
ThanksThis:
select count(*) total_Count
,count(decode(job,'MGR',1,null)) mgr_count
,count(case when deptno in (10,20) then
1
else
null
end
) dept_count
from emp;
untested -
Multiple conditin on a single column in a single query
i want to select data from the table using diff conditions on a single column
for eg:
i need emp details like whose having empno as 5-15,19-45,50-89 ..etc this how can i give a condition in a single query
we can use in or between for 2 or 3 conditions but i have plenty off like thisHi,
848525 wrote:
i want to select data from the table using diff conditions on a single column
for eg:
i need emp details like whose having empno as 5-15,19-45,50-89 ..etc this how can i give a condition in a single query
we can use in or between for 2 or 3 conditions but i have plenty off like thisYou can use OR for any number of conditions; it works the same for 4 or more.
You could also put the ranges into a table (or a sub-query, as shown below) and join:
WITH empno_ranges AS
SELECT 3000 AS low_val, 5000 AS high_val FROM dual UNION ALL
SELECT 7000, 7499 FROM dual UNION ALL
SELECT 7500, 7599 FROM dual UNION ALL
SELECT 7800, 7899 FROM dual
SELECT r.*
, COUNT (e.empno) AS emp_cnt
FROM empno_ranges r
LEFT OUTER JOIN scott.emp e ON e.empno BETWEEN r.low_val
AND r.high_val
GROUP BY r.low_val, r.high_val
ORDER BY r.low_val
;Output:
LOW_VAL HIGH_VAL EMP_CNT
3000 5000 0
7000 7499 2
7500 7599 2
7800 7899 3 -
All selected 'n' consecutive rows in retrieved in a single query
hello,
I have table T with 50,000 rows
create table T
(student_id number,
class_id number,
quiz_id number,
marks number)
some sample rows like
INSERT INTO T VALUES (1,1, 1, 50);
INSERT INTO T VALUES (2,2, 2, 40);
INSERT INTO T VALUES (3,1, 3, 34);
INSERT INTO T VALUES (1,1, 4, 10);
INSERT INTO T VALUES (1,1, 5, 30);
INSERT INTO T VALUES (1,1, 6, 29);
INSERT INTO T VALUES (3,2, 7, 34);
INSERT INTO T VALUES (3,2, 8, 33);
INSERT INTO T VALUES (3,2, 9, 56);
INSERT INTO T VALUES (1,1, 7, 90);
INSERT INTO T VALUES (2,2, 8, 0,);
INSERT INTO T VALUES (1,1, 8, 80);
INSERT INTO T VALUES (2,2, 8, 65);
INSERT INTO T VALUES (1,1, 9, 34);
INSERT INTO T VALUES (2,2, 9, 11);each student belongs to one class_id. each student participates in many quizes. each quiz has its unique id. each student can appear once in a quiz_id
I am doing the below analysis and query:
1. with below query I am finding which student_id had most marks in any 3 successive quizes (see the 3-1 part below) in the query..
SELECT QUIZ_ID,
STUDENT_ID,
SUM (MARKS) OVER (PARTITION BY STUDENT_ID ORDER BY QUIZ_ID1
RANGE BETWEEN CURRENT ROW AND (3-1) FOLLOWING) consecMARKS , MARKS FROM
(SELECT QUIZ_ID,
STUDENT_ID,
MARKS,
ROW_NUMBER() OVER (PARTITION BY STUDENT_ID ORDER BY T.QUIZ_ID) QUIZ_ID1
FROM T
WHERE MARKS IS NOT NULL
ORDER BY 1
ORDER BY 3 DESC
SQL> /
QUIZ_ID STUDENT_ID CONSECMARKS
7 1 170
6 1 166
8 1 129
5 1 106
8 3 89
8 2 76
3 3 68
7 3 67
8 2 65
1 1 60
9 3 56
QUIZ_ID STUDENT_ID CONSECMARKS
9 1 49
2 2 40
4 1 40
9 2 11
15 rows selected.With above query, I can play around and find for any 'n' number of consecutive quizes, like marks in 2 consecutives quizes, 3, 4 and so on but for each 'n' value I've to run a seperate query mentioning (2-1) or (3-1) or (4-1) and so on..
since my table is big and there are about 400 quizes so what I want to find out is for each 'n' consecutive quiz (from 1 to 400) which student had most marks for each consecutie 'n' quiz. Like in 1 (consecutive) quiz which student had the highest marks and then 2 conseuctive quiz who had most marks and then in 3 consecutive quiz who had most marks and so on till 400 consecutive quiz who had most marks... rather than running query for each 'n' value seperately i want a single query that can give me a summary of most marks in each n consecutive quizes...
my sample output is:
Nth consecutive quiz student_id sum(marks)
1 1 90
2 1 170
3 1 246
4
100
200
300
400 ? ? Is this possible to get the above output from one single query? If there are two or more students with equal most marks for any 'n' conseutive quizes then both should come in the summary.
Hope I have been able to put up my question clearly.
regards
RamisSomething like:
SELECT N,
QUIZ_ID,
STUDENT_ID,
SUM(MARKS) OVER (PARTITION BY N,STUDENT_ID ORDER BY QUIZ_ID1 RANGE BETWEEN CURRENT ROW AND (N-1) FOLLOWING) consecMARKS,
MARKS
FROM (SELECT QUIZ_ID,
STUDENT_ID,
MARKS,
ROW_NUMBER() OVER (PARTITION BY STUDENT_ID ORDER BY T.QUIZ_ID) QUIZ_ID1
FROM T
WHERE MARKS IS NOT NULL
SELECT LEVEL N
FROM DUAL
CONNECT BY LEVEL <= (
SELECT COUNT(DISTINCT QUIZ_ID)
FROM T
ORDER BY N,
consecMARKS DESC
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
1 7 1 90 90
1 8 1 80 80
1 8 2 65 65
1 9 3 56 56
1 1 1 50 50
1 2 2 40 40
1 9 1 34 34
1 7 3 34 34
1 3 3 34 34
1 8 3 33 33
1 5 1 30 30
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
1 6 1 29 29
1 9 2 11 11
1 4 1 10 10
1 8 2 0 0
2 7 1 170 90
2 6 1 119 29
2 8 1 114 80
2 8 3 89 33
2 8 2 76 65
2 3 3 68 34
2 7 3 67 34
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
2 8 2 65 0
2 1 1 60 50
2 5 1 59 30
2 9 3 56 56
2 2 2 40 40
2 4 1 40 10
2 9 1 34 34
2 9 2 11 11
3 7 1 204 90
3 6 1 199 29
3 5 1 149 30
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
3 7 3 123 34
3 8 1 114 80
3 2 2 105 40
3 3 3 101 34
3 1 1 90 50
3 8 3 89 33
3 8 2 76 65
3 8 2 76 0
3 4 1 69 10
3 9 3 56 56
3 9 1 34 34
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
3 9 2 11 11
4 6 1 233 29
4 5 1 229 30
4 7 1 204 90
4 4 1 159 10
4 3 3 157 34
4 7 3 123 34
4 1 1 119 50
4 2 2 116 40
4 8 1 114 80
4 8 3 89 33
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
4 8 2 76 0
4 8 2 76 65
4 9 3 56 56
4 9 1 34 34
4 9 2 11 11
5 5 1 263 30
5 4 1 239 10
5 6 1 233 29
5 1 1 209 50
5 7 1 204 90
5 3 3 157 34
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
5 7 3 123 34
5 2 2 116 40
5 8 1 114 80
5 8 3 89 33
5 8 2 76 0
5 8 2 76 65
5 9 3 56 56
5 9 1 34 34
5 9 2 11 11
6 1 1 289 50
6 4 1 273 10
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
6 5 1 263 30
6 6 1 233 29
6 7 1 204 90
6 3 3 157 34
6 7 3 123 34
6 2 2 116 40
6 8 1 114 80
6 8 3 89 33
6 8 2 76 0
6 8 2 76 65
6 9 3 56 56
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
6 9 1 34 34
6 9 2 11 11
7 1 1 323 50
7 4 1 273 10
7 5 1 263 30
7 6 1 233 29
7 7 1 204 90
7 3 3 157 34
7 7 3 123 34
7 2 2 116 40
7 8 1 114 80
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
7 8 3 89 33
7 8 2 76 0
7 8 2 76 65
7 9 3 56 56
7 9 1 34 34
7 9 2 11 11
8 1 1 323 50
8 4 1 273 10
8 5 1 263 30
8 6 1 233 29
8 7 1 204 90
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
8 3 3 157 34
8 7 3 123 34
8 2 2 116 40
8 8 1 114 80
8 8 3 89 33
8 8 2 76 0
8 8 2 76 65
8 9 3 56 56
8 9 1 34 34
8 9 2 11 11
9 1 1 323 50
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
9 4 1 273 10
9 5 1 263 30
9 6 1 233 29
9 7 1 204 90
9 3 3 157 34
9 7 3 123 34
9 2 2 116 40
9 8 1 114 80
9 8 3 89 33
9 8 2 76 0
9 8 2 76 65
N QUIZ_ID STUDENT_ID CONSECMARKS MARKS
9 9 3 56 56
9 9 1 34 34
9 9 2 11 11
135 rows selected.
SQL> SY. -
Is it possible to combine 2 different reports in a single Query?
Dear All,
What am I working at?
I produced a Query for Debtors Aged Analysis which mimics the Official SAP B1 8.8 Aging Report.
It ages the outstanding invoices by Posting Date ( RefDate in JDT1)
I also made another Report which ages outstanding amounts by Document Date simply by replacing all RefDate by TaxDate
They give different answers if Posting Date is different from Document Date, e.g a manual invoice dated 5 Jun 2011 is posted on 2 Jul 2011.
What I want to do?
My idea is to produce a SINGLE QUERY which will generate either Aging depending on settings:
(a) A Debtors Aging by Posting Date
(b) A Debtors Aging by Document Date
I declare 2 variables:
(a) @refdt is [%1] and represents Posting Date (JDT1 RefDate)
(b) @taxdt is [%2] and represents Document Date (JDT1 TaxDate)
When the Query is run, the foll dialog appears:
Query - Selection Criteria
Posting Date Equal .......
Document Date Equal .......
OK Cancel
We are expected to fill in only 1 date and leave the other blank, and Query will generate the required report .
What is my problem?
Query runs smoothly, but amounts in the Balance column does not get analyzed in the Age brackets: Current / 1 Mth Ago / etc
I think I know where's the problem
I am assuming (wrongly) that if we don't fill one date field, the query returns NULL for that variable. In fact, it appears to return GetDate().
Help
Can anybody help me put the correct commands so that all my balances are correctly analysed in the respective age buckets?
Thanks
Leon Lai
Here's a simplified SQL:
Tables :
JDT1 T0 = Journal Entry - Rows
OCRD T1 = Business Partner
OCPR T2 = Contact Person
OJDT T3 = Journal Entry - Header
OINV T4 = A/R Invoices - Header
ORIN T5 - A/R Credit Memo - Header
declare @refdt date
declare @taxdt date
set @refdt
/*Select 1 from jdt1 t where t.RefDate*/ = [%1]
set @taxdt
/*Select 1 from jdt1 w where w.TaxDate*/ = [%2]
SELECT
'company1' AS 'Company',
T1.CardCode AS 'BP Code',
T2.Notes2 AS 'BP Name',
T0.RefDate AS 'Pstg Dt',
T0.TaxDate AS 'Doc Dt',
CASE
WHEN T0.TransType = 13 THEN 'IN'
WHEN T0.TransType = 14 THEN 'CN'
WHEN T0.TransType = 30 THEN 'JE'
WHEN T0.TransType = 24 THEN 'RC'
WHEN T0.TransType = 46 THEN 'PS'
ELSE 'Error ! ! !'
END AS 'Doc Type',
T0.Ref1 'Doc. Number',
ISNULL(T0.FCCurrency, ' - ') AS 'Ccy',
(T0.FCDebit - T0.FCCredit) AS 'Orig. F.Ccy',
(T0.BalFcDeb - T0.BalFcCred) AS 'Bal. F. Ccy',
(T0.Debit - T0.Credit) AS 'Orig. Rs',
(T0.BalDueDeb - T0.BalDueCred) AS 'Bal. Rs',
/* ######################## PROBLEM is here ################## */
CASE
WHEN (@refdt is not null) and (@taxdt is null)
THEN ISNULL((SELECT T0.BalDueDeb -T0.BalDueCred
WHERE DateDiff(mm, T0.RefDate, @refdt) = 0 ) ,0)
WHEN (@refdt is null) and (@taxdt is not null)
THEN ISNULL((SELECT T0.BalDueDeb -T0.BalDueCred
WHERE DateDiff(mm, T0.TaxDate, @taxdt) = 0 ) ,0)
END AS 'Current Mth',
CASE
WHEN (@refdt is not null) and (@taxdt is null)
THEN ISNULL((SELECT T0.BalDueDeb -T0.BalDueCred
WHERE DateDiff(mm, T0.RefDate, @refdt) = 1 ) ,0)
WHEN (@refdt is null) and (@taxdt is not null)
THEN ISNULL((SELECT T0.BalDueDeb -T0.BalDueCred
WHERE DateDiff(mm, T0.TaxDate, @taxdt) = 1 ) ,0)
END AS '1 Mth Ago'
/* Similarly for other age buckets */
FROM company1.dbo.JDT1 T0
INNER JOIN company1.dbo.OCRD T1 ON T0.ShortName = T1.CardCode
LEFT OUTER JOIN company1.dbo.OCPR T2 ON T1.CardCode = T2.Cardcode
LEFT OUTER JOIN company1.dbo.OJDT T3 ON T0.TransID = T3.TransID
LEFT OUTER JOIN company1.dbo.OINV T4 ON T3.TransID = T4.TransID
LEFT OUTER JOIN company1.dbo.ORIN T5 ON T3.TransID = T5.TransID
WHERE
T1.CardType = 'C' and Balance != 0
and (T0.BalDueDeb - T0.BalDueCred) != 0HI
I generate the next aged analysis
CREATE PROCEDURE [dbo].[Aged_Analysis] (@end datetime,@Client VarChar (20)) AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets
-- interfering with SELECT statements.
SET NOCOUNT ON;
Declare @SAPUNION Table (SN VarChar(50), TransId Int, ReconSum Decimal(19,2), DebHab VarChar(1),
Linea Int)
insert into @SAPUNION
SELECT X0.ShortName 'SN', X0.TransId 'TransId', SUM(X0.ReconSum)'ReconSum', X0.IsCredit 'DebHab', X0.TransRowId 'Linea'
FROM ITR1 X0
INNER JOIN OITR X1 ON X1.ReconNum = X0.ReconNum
WHERE X1.ReconDate <= @end AND X1.CancelAbs = ''
GROUP BY X0.ShortName, X0.TransId, X0.IsCredit, X0.TransRowId
SELECT T0.CardCode, T0.CardName,T0.Address,T0.CreditLine,
T1.TransId , T4.BaseRef , T1.Ref2 , T1.RefDate, T1.DueDate,
CASE
WHEN T3.DebHab = 'D' THEN T1.Debit-T1.Credit-T3.ReconSum
WHEN T3.DebHab = 'C' THEN T1.Debit-T1.Credit+T3.ReconSum
ELSE (T1.Debit-T1.Credit)
END 'Balance',
CASE
when DateDiff(Day,t1.RefDate,GetDate()) <= 30 and T3.DebHab = 'D' then T1.Debit-T1.Credit-T3.ReconSum
when DateDiff(Day,t1.RefDate,GetDate()) <= 30 and T3.DebHab = 'C' then T1.Debit-T1.Credit+T3.ReconSum
when DateDiff(Day,t1.RefDate,GetDate()) <= 30 then (T1.Debit-T1.Credit) end '0-30 dias',
CASE
when DateDiff(Day,t1.refdate,GetDate()) between 31 and 45 and T3.DebHab = 'D' then T1.Debit-T1.Credit-T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) between 31 and 45 and T3.DebHab = 'C' then T1.Debit-T1.Credit+T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) between 31 and 45 then (T1.Debit-T1.Credit) end '31-45 dias',
CASE
when DateDiff(Day,t1.refdate,GetDate()) between 46 and 60 and T3.DebHab = 'D' then T1.Debit-T1.Credit-T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) between 46 and 60 and T3.DebHab = 'C' then T1.Debit-T1.Credit+T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) between 46 and 60 then (T1.Debit-T1.Credit) end '46-60 dias',
CASE
when DateDiff(Day,t1.refdate,GetDate()) between 61 and 75 and T3.DebHab = 'D' then T1.Debit-T1.Credit-T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) between 61 and 75 and T3.DebHab = 'C' then T1.Debit-T1.Credit+T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) between 61 and 75 then (T1.Debit-T1.Credit) end '61-75 dias',
CASE
when DateDiff(Day,t1.refdate,GetDate()) BETWEEN 76 AND 89 and T3.DebHab = 'D' then T1.Debit-T1.Credit-T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) BETWEEN 76 AND 89 and T3.DebHab = 'C' then T1.Debit-T1.Credit+T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) BETWEEN 76 AND 89 then (T1.Debit-T1.Credit) end '76-89 dias',
CASE
when DateDiff(Day,t1.refdate,GetDate()) >90 and T3.DebHab = 'D' then T1.Debit-T1.Credit-T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) >90 and T3.DebHab = 'C' then T1.Debit-T1.Credit+T3.ReconSum
when DateDiff(Day,t1.refdate,GetDate()) >90 then (T1.Debit-T1.Credit) end '90-Mas',
CASE T1.TransType
WHEN '13' THEN (SELECT Y.Comments FROM OINV Y WHERE Y.TransId = T1.TransId)
WHEN '14' THEN (SELECT Y.Comments FROM ORIN Y WHERE Y.TransId = T1.TransId)
WHEN '24' THEN (SELECT Y.Comments FROM ORCT Y WHERE Y.TransId = T1.TransId)
ELSE T1.LineMemo
END 'Comments'
FROM OCRD T0
INNER JOIN JDT1 T1 ON T1.ShortName = T0.CardCode
INNER JOIN OACT T2 ON T2.AcctCode = T1.Account
INNER JOIN OJDT T4 ON T4.TransId = T1.TransId
LEFT JOIN OINV T5 ON T5.TransId = T4.TransId and t5.ObjType = t4.TransType
LEFT JOIN @SAPUNION T3 ON T3.TransId = T1.TransId AND T3.SN = T1.ShortName AND T3.Linea = T1.Line_ID
WHERE T0.CardType = 'C' /*FOR CLIENTS*/ AND T1.RefDate <= @end AND T2.AcctCode = /*YOUR CLIENT ACCOUNT*/ AND
(CASE
WHEN T3.DebHab = 'D' THEN (T1.Debit-T1.Credit-T3.ReconSum)
WHEN T3.DebHab = 'C' THEN (T1.Debit-T1.Credit+T3.ReconSum)
ELSE (T1.Debit-T1.Credit)
END) != '0'
AND T0.CardCode= @Client
ORDER BY T0.CardCode,T1.TransId,t1.Ref2
END
AND Execute by SAP
DECLARE @VAR INT, @DATE DATETIME, @BP VARCHAR(8)
SET @VAR = (SELECT TOP 1 T.DocEntry FROM [dbo].[OINV] T WHERE T.DocDate <='[%0]' AND T.CardCode='[%1]')
SET @DATE = '[%0]'
SET @BP = '[%1]'
EXECUTE [dbo].[Aged_Analysis]
@end = @DATE,
@Client = @BP
Regards
Floyola
Edited by: Floyola on Jul 22, 2011 10:17 AM -
Double aggregation in a single query block doesn't make any sence.
How can I argue with something that apparently has been cast in stone by ANSI SQL committee? Well the answer is famous: "Search any park in any city: you'll find no statue of committee".
OK, why
select count(1) from (
select deptno from emp
group by deptno
is an easy to understand query, and why
select count(count(*)) from emp
group by deptno
is not? I already mentioned one reason why count shouldn't accept any arguments, therefore count(count(*)) is a nonsence.
The other reason is that aggregation without grouping is essentially aggregation within a single group. Once you realize that
select sum(1) from emp
is the same as
select sum(1) from emp
group by -1
(where -1 or any other constant for that matter is a dummy pseudocolumn), then it becomes obvious that what we are doing in the infamous
select count(count(*)) from emp
group by deptno
is a query with two blocks
select count(1) from (
select deptno from emp
group by deptno
) group by -1
We are not allowed to combine two "group by" into a single query, aren't we?Aggregate function always goes together with grouping. Grouping can partition the set of rows into many classes or a single class. Therefore, if we have 2 nested aggregation functions, we'd better be able to identify the corresponding groupings easily:
select state, avg(min(tax_return)) from household
group by city, state then statewhich is a shorthand for
select state, avg(m) from (
select city, state, min(tax_return) m
from household
group by city, state
) group by stateSpeaking of double aggregation, it is frequent in graph queries. The part explosion query is posted repeatedly virtually every month on this fine forum:-) The part explosion is double aggregation: multiply the quantities along each path in the assembly hierarchy. Then add the quantities along alternative paths. Likewise, finding a shortest path between two nodes in a graph is double aggregation query. First, we calculate the length buy adding the distances along each path, and then we choose a path with minimal length. Wouldn't it be nice to have this double aggregation wired into the connect by syntax? Note that connect_by_path is a surrogate aggregate which concatenates strings. People invent all kind of functions which parse this path and make other aggregates out of this value (such as sum and product).
Maybe you are looking for
-
Cancelled print but will not cancel and comes back on to print same job
cancelled print but will not cancel and comes back on to print same job on on hp deskjet all in one
-
Dear Friends I have an RO/SO for which we have created goodsmovement in 05/2008 and want to reverse the same in current period. but while doing it I am getting error as RE Quantity moved exceeded by 1 EA : MATERIAL PLNT Storage LOC Message no. M7022
-
Hi all! I googled EJB: Enterprise Java Beans. A standard distributed component model. The encapsulation of business logic into business objects is the most recent focus of the information Technology industry. Objectified business logic. Server compon
-
Procedure for opening jpegs in Camera RAW
I am helping a friend who is running Elements 6 on an iMac. I can't seem to find the setup which will allow him to open jpegs in Camera RAW. I know this must be simple but I'm having trouble. Thanks for your help. Mary Lou
-
Cannot Open ID File - Please Help
Hello, I was sent a file by a client in InDesign, but when I try to open it I get the following message: "Cannot open (file name). Please update plugins to their latest versions or update to the latest version of Adobe InDesign." I tried downloading