Help: multiple-row subquery
Hi,
My question hinges off the same type of DB as the question asked on here a little while back (https://forums.oracle.com/thread/1982906).
The specific question is: Determine which author or authors wrote the books most frequently purchased by customers of JustLee Books
I am trying to build a multiple-row subquery (I'm not sure if this would be the best way to approach). I supplied the table at the bottom of this post.
Per my code below, as you can see, this is not working for me. I'm trying to pull the total count of each book (via isbn inside table authorid), then I'll look-up the author code and ultimately the author's name (table orderitems then bookauthor) . I'm working from the inside out, and cannot get past using the first subquery.
Could someone please be able to help point me in the right direction?
Thanks for your help!
SQL> SELECT isbn, authorid
2 FROM bookauthor
3 WHERE isbn IN (SELECT COUNT(isbn)
4 FROM orderitems
5 GROUP BY isbn)
6 ORDER BY isbn, authorid;
no rows selected
TABLES:
SQL> select * from orderitems;
ORDER# ITEM# ISBN QUANTITY PAIDEACH
1000 1 3437212490 1 19.95
1001 1 9247381001 1 31.95
1001 2 2491748320 1 85.45
1002 1 8843172113 2 55.95
1003 1 8843172113 1 55.95
1003 2 1059831198 1 30.95
1003 3 3437212490 1 19.95
1004 1 2491748320 2 85.45
1005 1 2147428890 1 39.95
1006 1 9959789321 1 54.5
1007 1 3957136468 3 72.15
1007 2 9959789321 1 54.5
1007 3 8117949391 1 8.95
1007 4 8843172113 1 55.95
1008 1 3437212490 2 19.95
1009 1 3437212490 1 19.95
1009 2 0401140733 1 22
1010 1 8843172113 1 55.95
1011 1 2491748320 1 85.45
1012 1 8117949391 1 8.95
1012 2 1915762492 2 25
1012 3 2491748320 1 85.45
1012 4 0401140733 1 22
1013 1 8843172113 1 55.95
1014 1 0401140733 2 22
1015 1 3437212490 1 19.95
1016 1 2491748320 1 85.45
1017 1 8117949391 2 8.95
1018 1 3437212490 1 19.95
1018 2 8843172113 1 55.95
1019 1 0401140733 1 22
1020 1 3437212490 1 19.95
SQL> select * from bookauthor;
ISBN AUTH
0132149871 S100
0299282519 S100
0401140733 J100
1059831198 P100
1059831198 S100
1915762492 W100
1915762492 W105
2147428890 W105
2491748320 B100
2491748320 F100
2491748320 R100
3437212490 B100
3957136468 A100
4981341710 K100
8117949391 R100
8843172113 A100
8843172113 A105
8843172113 P105
9247381001 W100
9959789321 J100
20 rows selected.
SQL> select * from author;
AUTH LNAME FNAME
S100 SMITH SAM
J100 JONES JANICE
A100 AUSTIN JAMES
M100 MARTINEZ SHEILA
K100 KZOCHSKY TAMARA
P100 PORTER LISA
A105 ADAMS JUAN
B100 BAKER JACK
P105 PETERSON TINA
W100 WHITE WILLIAM
W105 WHITE LISA
R100 ROBINSON ROBERT
F100 FIELDS OSCAR
W110 WILKINSON ANTHONY
14 rows selected.
a35c130d-ca92-46ca-8177-8a8b5ee02876 wrote:
Hi,
My question hinges off the same type of DB as the question asked on here a little while back (https://forums.oracle.com/thread/1982906).
The specific question is: Determine which author or authors wrote the books most frequently purchased by customers of JustLee Books
I am trying to build a multiple-row subquery (I'm not sure if this would be the best way to approach). I supplied the table at the bottom of this post.
Per my code below, as you can see, this is not working for me. I'm trying to pull the total count of each book (via isbn inside table authorid), then I'll look-up the author code and ultimately the author's name (table orderitems then bookauthor) . I'm working from the inside out, and cannot get past using the first subquery.
Could someone please be able to help point me in the right direction?
Thanks for your help!
SQL> SELECT isbn, authorid
2 FROM bookauthor
3 WHERE isbn IN (SELECT COUNT(isbn)
4 FROM orderitems
5 GROUP BY isbn)
6 ORDER BY isbn, authorid;
no rows selected
TABLES:
SQL> select * from orderitems;
ORDER# ITEM# ISBN QUANTITY PAIDEACH
1000 1 3437212490 1 19.95
1001 1 9247381001 1 31.95
1001 2 2491748320 1 85.45
1002 1 8843172113 2 55.95
1003 1 8843172113 1 55.95
1003 2 1059831198 1 30.95
1003 3 3437212490 1 19.95
1004 1 2491748320 2 85.45
1005 1 2147428890 1 39.95
1006 1 9959789321 1 54.5
1007 1 3957136468 3 72.15
1007 2 9959789321 1 54.5
1007 3 8117949391 1 8.95
1007 4 8843172113 1 55.95
1008 1 3437212490 2 19.95
1009 1 3437212490 1 19.95
1009 2 0401140733 1 22
1010 1 8843172113 1 55.95
1011 1 2491748320 1 85.45
1012 1 8117949391 1 8.95
1012 2 1915762492 2 25
1012 3 2491748320 1 85.45
1012 4 0401140733 1 22
1013 1 8843172113 1 55.95
1014 1 0401140733 2 22
1015 1 3437212490 1 19.95
1016 1 2491748320 1 85.45
1017 1 8117949391 2 8.95
1018 1 3437212490 1 19.95
1018 2 8843172113 1 55.95
1019 1 0401140733 1 22
1020 1 3437212490 1 19.95
SQL> select * from bookauthor;
ISBN AUTH
0132149871 S100
0299282519 S100
0401140733 J100
1059831198 P100
1059831198 S100
1915762492 W100
1915762492 W105
2147428890 W105
2491748320 B100
2491748320 F100
2491748320 R100
3437212490 B100
3957136468 A100
4981341710 K100
8117949391 R100
8843172113 A100
8843172113 A105
8843172113 P105
9247381001 W100
9959789321 J100
20 rows selected.
SQL> select * from author;
AUTH LNAME FNAME
S100 SMITH SAM
J100 JONES JANICE
A100 AUSTIN JAMES
M100 MARTINEZ SHEILA
K100 KZOCHSKY TAMARA
P100 PORTER LISA
A105 ADAMS JUAN
B100 BAKER JACK
P105 PETERSON TINA
W100 WHITE WILLIAM
W105 WHITE LISA
R100 ROBINSON ROBERT
F100 FIELDS OSCAR
W110 WILKINSON ANTHONY
14 rows selected.
with
iisbn as ( select isbn, count(isbn) cnt from orderitems group by isbn )
SELECT ii.isbn, ba.authorid, ii.cnt
FROM bookauthor ba, iisbn ii
where ba.isbn = ii.isbn
Similar Messages
-
How can i use multiple row subquery in update statement
Hai All
I using group function in my update statement.. and i need to update more rows so i need to use multiple row
subquery pls tell me how to use multiple row subquery in update statement
For example
while i am using this like this i got an error
update dail_att set outtime in (select max(r2.ptime) from temp_att where empcode=r2.enpno and
barcode=r2.cardn and attend_date=r2.pdate group by enpno,pdate,cardn);
Pls tell me how to use with example
Thanks & regards
Srikkanth.MHai Man
Thanks for ur response Let me clear what i need
First step Fetch the records as text file and stores into table T1
and the next step is i have seperated the text using substring and stores in different columns of a table
There are two shifts 0815 to 1645 and 1200 and 2000
Here I rep IN and O rep OUT
Empno date time inout
001 01-01-10 0815 I
002 01-01-10 0815 I
003 01-01-10 0818 I
001 01-01-10 1100 0
001 01-01-10 1130 I
002 01-01-10 1145 0
002 01-01-10 1215 I
004 01-01-10 1200 I
005 01-01-10 1215 I
004 01-01-10 1315 O
004 01-01-10 1345 I
001 01-01-10 1645 0
002 01-01-10 1715 0
003 01-01-10 1718 0
004 01-01-10 2010 0
005 01-01-10 2015 0
This is my T1 table i have taken data from text file and stored in this table from this table i need to move data to another table T2
T2 contains like this
Empno Intime Intrin Introut Outtime Date
001 0815 1100 1130 1645 01-01-10
002 0815 1145 1215 1715 01-01-10
003 0818 1718 01-01-10
004 1200 1315 1345 2010 01-01-10
005 1215 2015 01-01-10
This what i am trying to do man but i have little bit problems Pls give some solution with good example
And my coding is
declare
emp_code varchar2(25);
in_time varchar2(25);
out_time varchar2(25);
Cursor P1 is
Select REASON,ECODE,READMODE,EMPD,ENPNO,FILL,PDATE,PTIME,INOUT,CARDN,READERN
From temp_att
group by REASON,ECODE,READMODE,EMPD,ENPNO,FILL,PDATE,PTIME,INOUT,CARDN,READERN
ORDER BY enpno,pdate,ptime;
begin
for r2 in p1 loop
declare
bar_code varchar2(25);
begin
select barcode into bar_code from dail_att where empcode=r2.enpno and attend_date=r2.pdate;
For r3 in (select empcode,empname,barcode,intime,intrin,introut,addin,addout,outtime,attend_date from dail_att)loop
if r2.inout ='O' then
update dail_att set outtime =(select max(r2.ptime) from temp_att where empcode=r2.enpno and barcode=r2.cardn and attend_date=r2.pdate group by r2.cardn,r2.enpno,r2.pdate );
end if;
end loop;
exception
when no_data_found then
if r2.inout ='I' then
insert into dail_att(barcode,empcode,intime,attend_date)(select r2.cardn,r2.enpno,min(r2.ptime),r2.pdate from temp_att group by r2.cardn,r2.enpno,r2.pdate );
end if;
end;
end loop;
commit;
end;
Pls tell me what correction i need to do i the update statement i have used a subquery with group function but when i used it will return only one row but my need is to return many rows and i need to use multiple row subquery
and how can i use it in the update statement
Thanks In Advance
Srikkanth.M -
Multiple row subquery with like operator
can any1 give me an example where we can use a multiple row subquery with the like operator.I read it can be used but when i tried it gives the following error
select * from gagan_emp where ename like (select ename from gagan_emp where deptno=10)
ERROR at line 1:
ORA-01427: single-row subquery returns more than one rowThe right part of 'LIKE' is permitted only single value expression
(including subquery that returns single value),
is not permitted multiple values.
-- Examples (but.... not so good)
select * from gagan_emp e0
where exists
(select ename from gagan_emp e1 where deptno=10
and e0.ename like e1.ename)
select * from gagan_emp e0
where exists
(select ename from gagan_emp e1 where deptno=10
and e0.ename = e1.ename)
select * from gagan_emp e0
where ename = any
(select ename from gagan_emp e1 where deptno=10)
select * from gagan_emp
where ename like
(select ename from gagan_emp e1 where deptno=10 and rownum=1)
; -
Newbie needs help again.
My SQL statement returns multiple rows, but even after reading the manuals I still cannot figure out how to use the IN, ANY or ALL operators to make it multiple-row.
Version:
BANNER
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Product
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
update proj_assigned
set project_cost = (select job_charge_per_hour * hours_allocated from proj_assigned);
RESULT:: single-row subquery returns more than one row
Edited by: 996465 on 2013/03/28 10:47 AMthank you.
The SQL statement must update the project_cost table with the correct value, that is job_charge_per_hour x hours_ allocated.
the table:
Column Name Data Type Nullable Default Primary Key
PROJ_ID VARCHAR2(10) No - 1
EMP_ID VARCHAR2(10) No - 2
JOB_CODE VARCHAR2(10) Yes - -
JOB_CHARGE_PER_HOUR NUMBER(7,2) Yes - -
HOURS_ALLOCATED NUMBER(5,0) Yes - -
PROJECT_COST NUMBER(10,2) Yes - -
The data:
PROJ_ID------------ EMP_ID-------------- JOB_CODE--------------- JOB_CHARGE_PER_HOUR------------- HOURS_ALLOCATED------------ PROJECT_COST
ABCSYS -------------FLANAGJ------------ WEBDES ------------------150 -------------------------------------------10------------------------------------ 1500
ABCSYS------------- NKOSIM------------- WEBDES ------------------150------------------------------------------- 5-------------------------------------- 750
HRFIN---------------- NAIDOOL----------- HRFIN-----------------------100------------------------------------------ 10------------------------------------- 1000
HRFIN---------------- sithols---------------- WEBDES------------------ 140------------------------------------------ 10------------------------------------- 1400
PRIMWEB----------- becker--------------- WEBDES-------------------150------------------------------------------ 100----------------------------------- 15000
QWENET----------- NAIDOOL-------------HRFIN---------------------- 100------------------------------------------ 10------------------------------------ 1000
QWENET----------- SEOPAT --------------ITMNG---------------------150--------------------------------------------10------------------------------------ 1500
QWENET----------- singhs------------------SYSANA------------------ 150------------------------------------------- 10------------------------------------ 1500
QWENET----------- beckerl----------------SYSANA -------------------10--------------------------------------------- 5-------------------------------------- 50 -
LIKE operator in multiple-row subqueries
Hello,
in a test i saw 2 questions:
Which operator can be used with a multiple-row subquery?
A. =
B. LIKE
C. BETWEEN
D. NOT IN
E. IS
F. <>
Answer: D
and
Which two statements about subqueries are true? (Choose two.)
A. A single row subquery can retrieve data from only one table.
B. A SQL query statement cannot display data from table B that is referred to in its
subquery, unless table B is included in the main query's FROM clause.
C. A SQL query statement can display data from table B that is referred to in its subquery,
without including table B in its own FROM clause.
D A single row subquery can retrieve data from more than one table.
E. A single row subquery cannot be used in a condition where the LIKE operator is used for
comparison.
F. A multiple-row subquery cannot be used in a condition where the LIKE operator is used for
comparison.
Answer: B & D
But in the last question, why F is not correct? because the 1st question says that only NOT IN can be used in multiple-row subqueries. I'm confused
Thanksonly two, but what principle applies if not specified? First two correct?
however, in explanation i saw something like this (regarding to the 2nd question)
Incorrect Answers
A: A single row sub-query can retrieve data from more than one table.
C: A SQL query statement cannot display data from table B that is referred to in its subquery,
unless table B is included in the main query's FROM clause.
E: A single row sub-query can be used in a condition where the LIKE operator is used for
comparison.
F: A multiple-row sub-query can be used in a condition where the LIKE operator is used for
comparison.
so, at F: can be used or nor? they aren't so clear. only which operators can be used in multiple-row subquery? -
Trouble updating multiple rows in table using subquery
Hi everyone, I'm having trouble updating multiple rows with a subquery. Here's the setup:
create table mytable (
col_a number primary key,
col_b number,
col_c number,
col_d number);
insert into mytable values (1 ,1,1,15);
insert into mytable values (2 ,1,2,7 );
insert into mytable values (3 ,1,3,11);
insert into mytable values (4 ,1,4,23);
insert into mytable values (5 ,1,5,14);
insert into mytable values (6 ,2,1,50);
insert into mytable values (7 ,2,2,41);
insert into mytable values (8 ,2,3,13);
insert into mytable values (9 ,2,4,12);
insert into mytable values (10,2,5,19);
insert into mytable values (11,3,1,10);
insert into mytable values (12,3,2,92);
insert into mytable values (13,3,3,81);
insert into mytable values (14,3,4,17);
insert into mytable values (15,3,5,66);
insert into mytable values (16,4,1,54);
insert into mytable values (17,4,2,41);
insert into mytable values (18,4,3,22);
insert into mytable values (19,4,4,24);
insert into mytable values (20,4,5,17);For this example, using an update statement (or merge if that's better), say I want to set the values for col_d where col_b = 3 equal to the values for col_d where col_b = 1 and col_c equal each other. Results should look like the following after the update:
col_a col_b col_c col_d
1 1 1 15
2 1 2 7
3 1 3 11
4 1 4 23
5 1 5 14
6 2 1 50
7 2 2 41
8 2 3 13
9 2 4 12
10 2 5 19
11 3 1 15
12 3 2 7
13 3 3 11
14 3 4 23
15 3 5 14
16 4 1 54
17 4 2 41
18 4 3 22
19 4 4 24
20 4 5 17I can see it right there at my fingertips using this query, where I want to set b_col_d = a_col_d, but I'm missing something, as this query returns too many rows when used in the update statement.
select * from (
select col_a as a_col_a, col_b as a_col_b, col_c as a_col_c, col_d as a_col_d
from mytable
where col_b = 1
) a, (
select col_a as b_col_a, col_b as b_col_b, col_c as b_col_c, col_d as b_col_d
from mytable
where col_b = 3
) b
where a.a_col_c = b.b_col_cupdate mytable set column_d = (select ??? where exists ???)
Can someone help me get there? I'm using 10GR2.
Thanks!
MarkHopefully this is what you are looking for:
SQL > UPDATE mytable myt1
2 SET col_d = ( SELECT myt2.col_d
3 FROM mytable myt2
4 WHERE myt2.col_b = 1
5 AND myt1.col_c = myt2.col_c
6 )
7 WHERE col_b = 3
8 AND EXISTS
9 ( SELECT NULL
10 FROM mytable myt2
11 WHERE myt2.col_c = myt1.col_c
12 )
13 ;
5 rows updated.
SQL > SELECT * FROM mytable ORDER BY col_a;
COL_A COL_B COL_C COL_D
1 1 1 15
2 1 2 7
3 1 3 11
4 1 4 23
5 1 5 14
6 2 1 50
7 2 2 41
8 2 3 13
9 2 4 12
10 2 5 19
11 3 1 15
12 3 2 7
13 3 3 11
14 3 4 23
15 3 5 14
16 4 1 54
17 4 2 41
18 4 3 22
19 4 4 24
20 4 5 17
20 rows selected.Thank you so much for providing the sample data in an easy to consume form, as well as the expected output. -
Help me with returing multiple rows - Query
I am trying to return multiple rows and i need help with my query.
and most important of all one of the requirement is the following:
SERVICE LEVEL has categories Sergeant, Bonus I, All Deputies, Deputy Bailiff, Deputy Lockup, Deputy Bailiff Security, Custody Assistant,
Security Officer, Security Assistant, Security Officer and Security Assistant, Private Security, ALL, All Sworn)
Note: Service Level “All Deputies” includes Deputy Bailiff, Deputy Bailiff Security and Deputy Lockup
*“All Sworn”: includes Sergeant, Bonus I, All Deputies, Deputy Bailiff, Deputy Lockup, Deputy Bailiff Security*
//this code doesn't work cuz case- when statement return only one row. but it works for singles such as 'Sergeant'
select *
from in_service
where rank IN (CASE TRIM(UPPER(:SL))
WHEN 'ALL DEPUTIES' THEN
(SELECT DISTINCT RANK FROM IN_SERVICE
WHERE UPPER(RANK) LIKE 'DEPUTY%')
WHEN 'ALL SWORN' THEN
(SELECT DISTINCT RANK FROM IN_SERVICE
WHERE UPPER(RANK) LIKE 'DEPUTY%' OR
UPPER(RANK) = 'SERGEANT' OR
UPPER(RANK) = 'BONUS 1')
WHEN 'ALL' THEN
(SELECT DISTINCT RANK FROM IN_SERVICE
WHERE UPPER(RANK) LIKE 'DEPUTY%' OR
UPPER(RANK) = 'SERGEANT' OR
UPPER(RANK) = 'BONUS 1' OR
UPPER(RANK) LIKE 'SECURITY%' OR
UPPER(RANK) = 'CUSTODY ASSISTANT' OR
UPPER(RANK) = 'PRIVATE SECURITY')
end ) I was able to get multiple rows for 'ALL' and specified category like 'Sergeant' or 'Bonus I' from the code below, but NOT for 'All Deputies' for example which includes Deputy Bailiff, Deputy Bailiff Security and Deputy Lockup. I know CASE, WHEN does NOT return multiple rows, but i am having problems writing the query to make it work for all categories as the requirements mentioned above.
WHERE RANK IN (SELECT RANK FROM (SELECT RANK, 'ALL' ALL_SERVICE
FROM IN_SERVICE
UNION ALL
SELECT RANK, RANK
FROM IN_SERVICE) WHERE ALL_SERVICE = :SL)Please help.
Thanks in advanceIf you define your service_level as a table then it will be much easier.
with service_level
as
select 'ALL' parent_lvl, 'Sergeant' srv_lvl from dual union all
select 'ALL', 'Bonus I' from dual union all
select 'ALL', 'Deputy Bailiff' from dual union all
select 'ALL', 'Deputy Lockup' from dual union all
select 'ALL', 'Deputy Bailiff Security' from dual union all
select 'ALL', 'Custody Assistant' from dual union all
select 'ALL', 'Security Officer' from dual union all
select 'ALL', 'Security Assistant' from dual union all
select 'ALL', 'Security Officer and Security Assistant' from dual union all
select 'ALL', 'Private Security' from dual union all
select 'All Deputies', 'Deputy Bailiff' srv_lvl from dual union all
select 'All Deputies', 'Deputy Bailiff Security' from dual union all
select 'All Deputies', 'Deputy Lockup' from dual union all
select 'All Sworn', 'Sergeant' srv_lvl from dual union all
select 'All Sworn','Bonus I' from dual union all
select 'All Sworn','All Deputies' from dual union all
select 'All Sworn','Deputy Bailiff' from dual union all
select 'All Sworn','Deputy Lockup' from dual union all
select 'All Sworn','Deputy Bailiff Security' from dual
select *
from in_service
where rank IN (
select srv_lvl
from service_level
where upper(parent_lvl) = upper(:SL)
or upper(srv_lvl) = upper(:SL)
) -
Multiple row selection & Send Email Code ? Need littel Help
Dear All,
I managed to insert a code which will enable me to select multiple rows (Artikel from the great Yann Duran),
i also have a code which enables me to send a mail for each selected row (only one row).
But now since I was able to select more rows, I need to to customize my "Send mail" code to send mail to all selected rows. I guess I will need a loop here but I am not sure.
My code for multiy row selection :
private const string _CONTROL = "vw_CustLedgerEntry" // This is my Data Grid;
private DataGrid _ItemsList = null;
private int _SelectedRowsCount = 0;
partial void Part_2_CustomerItemDetail_InitializeDataWorkspace(List<IDataService> saveChangesTo)
// Write your code here.
this.FindControl(_CONTROL).ControlAvailable += Orders_ControlAvailable;
private void Orders_ControlAvailable(object sender, ControlAvailableEventArgs e)
_ItemsList = e.Control as DataGrid;
//if the cast failed, just leave, there's nothing more we can do here
if (_ItemsList == null)
return;
//set the property on the grid that allows multiple selection
_ItemsList.SelectionMode = DataGridSelectionMode.Extended;
_ItemsList.SelectionChanged += new SelectionChangedEventHandler(_ItemsList_SelectionChanged);
private void _ItemsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
switch (_ItemsList == null)
case true:
_SelectedRowsCount = 0;
break;
case false:
_SelectedRowsCount = _ItemsList.SelectedItems.Count;
break;
This is my code for sending a mail for one selected row:
partial void EMail_Execute() // EMAIL BUTTON FOR OPEN ENTRIES
if (vw_CustLedgerEntry.SelectedItem.Report_Type == null)
// throw new ArgumentNullException();
this.ShowMessageBox("EMail Can't be sent,PDF generation is not possible for this Entry");
this.Application.ShowPart_2_CustomerItemDetail(this.vw_CustomerItem.Costomer_No_, this.vw_CustomerItem.Company);
else// if (vw_CustLedgerEntry.SelectedItem.Send_Mail== true)
//do
vw_CustLedgerEntryItem1 entryItem = this.vw_CustLedgerEntry.SelectedItem;
InvSendbyMailRequestBody reqBody = new InvSendbyMailRequestBody(
entryItem.Document_No_
, entryItem.Report_Type
, "DynNavHRS"
, this.Application.User.Name.Replace(@"HRS\", "") + "@hrs.com" // HRS001
, "Document"
, false
, false
, this.vw_CustomerItem.ISO_Code // Change 7.8.2014 Bug in Email body text sprache
, this.vw_CustomerItem.Salesperson_E_mail // Change 7.8.2014 Bug in Send E-mail
, entryItem.Customer_No_.ToString()
, false
, "XYZ"
, false);
InvSendbyMailRequest req = new InvSendbyMailRequest(reqBody);
HRSReportServiceSoapClient wsHRS = new HRSReportServiceSoapClient();
// wsHRS.InvSendbyMailCompleted += new EventHandler<InvSendbyMailCompletedEventArgs>(wsHRS_InvGetPDFCompleted);
wsHRS.InvSendbyMailAsync(req);
this.ShowMessageBox("Your email was successfully sent");
// while (vw_CustLedgerEntry.SelectedItem.Send_Mail == true);
Thaks a lot for your help.
ZayedI tried the following but I donot know if its correct and Iam facing a problem with the "Foreach" function.
private const string _CONTROL = "vw_CustLedgerEntry" // This is my Data Grid;
private DataGrid _ItemsList = null;
private int _SelectedRowsCount = 0;
partial void Part_2_CustomerItemDetail_InitializeDataWorkspace(List<IDataService> saveChangesTo)
// Write your code here.
this.FindControl(_CONTROL).ControlAvailable += Orders_ControlAvailable;
private void Orders_ControlAvailable(object sender, ControlAvailableEventArgs e)
_ItemsList = e.Control as DataGrid;
//if the cast failed, just leave, there's nothing more we can do here
if (_ItemsList == null)
return;
//set the property on the grid that allows multiple selection
_ItemsList.SelectionMode = DataGridSelectionMode.Extended;
_ItemsList.SelectionChanged += new SelectionChangedEventHandler(_ItemsList_SelectionChanged);
private void _ItemsList_SelectionChanged(object sender, SelectionChangedEventArgs e)
switch (_ItemsList == null)
case true:
_SelectedRowsCount = 0;
break;
case false:
_SelectedRowsCount = _ItemsList.SelectedItems.Count;
break;
partial void Send_Multiple_Mail_CanExecute(ref bool result)
//only enable rows have actually been selected
result = (_SelectedRowsCount > 0);
partial void Send_Multiple_Mail_Execute()
if (_ItemsList == null) { return; }
//StringBuilder names = new StringBuilder();
//loop through the selected rows
//we're casting each selected row as a DemoItem
//so we get access to all the properties of the entity that the row represents
foreach (_ItemsList.SelectedItems)
vw_CustLedgerEntryItem1 entryItem = this.vw_CustLedgerEntry.SelectedItem;
InvSendbyMailRequestBody reqBody = new InvSendbyMailRequestBody(
entryItem.Document_No_
, entryItem.Report_Type
, "DynNavXYZ"
, this.Application.User.Name.Replace(@"HRS\", "") + "@hrs.com" // HRS001
, "Document"
, false
, false
, this.vw_CustomerItem.ISO_Code // Change 7.8.2014 Bug in Email body text sprache
, this.vw_CustomerItem.Salesperson_E_mail // Change 7.8.2014 Bug in Send E-mail
, entryItem.Customer_No_.ToString()
, false
, "XYZ"
, false);
InvSendbyMailRequest req = new InvSendbyMailRequest(reqBody);
XYZReportServiceSoapClient wsHRS = new HRSReportServiceSoapClient();
// wsHRS.InvSendbyMailCompleted += new EventHandler<InvSendbyMailCompletedEventArgs>(wsHRS_InvGetPDFCompleted);
wsHRS.InvSendbyMailAsync(req);
this.ShowMessageBox("Your email was successfully sent"); -
Help req : alv grid with multiple row selection
Hi all sap gurus,
i have a alv list display program , in which i can select the o/p rows(multiple rows)
and perform some actiom based on some icons .
now i have to convert this in to grid display
this is initial code i.e for list
DATA : BEGIN OF itab OCCURS 0.
INCLUDE STRUCTURE ztest.
DATA : checkbox type c.
DATA : END OF itab.
s_layout-box_fieldname = 'CHECKBOX'.
ty_events-name = slis_ev_top_of_page.
ty_events-form = 'TOP_OF_PAGE'.
APPEND ty_events TO it_events.
ALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = v_repid
i_internal_tabname = 'ITAB'
i_inclname = v_repid
CHANGING
ct_fieldcat = build_fieldcatalog.
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
I_INTERFACE_CHECK = ' '
I_BUFFER_ACTIVE = ' '
i_callback_program = v_repid
i_callback_pf_status_set = 'SET_PF_STATUS'
i_callback_user_command = 'USER_COMMAND'
i_structure_name = 'ITAB'
is_layout = s_layout
it_fieldcat = build_fieldcatalog[]
IT_EXCLUDING =
IT_SPECIAL_GROUPS =
IT_SORT =
IT_FILTER =
IS_SEL_HIDE =
I_DEFAULT = 'X'
I_SAVE = ' '
IS_VARIANT =
it_events = it_events
IT_EVENT_EXIT =
IS_PRINT =
IS_REPREP_ID =
I_SCREEN_START_COLUMN = 0
I_SCREEN_START_LINE = 0
I_SCREEN_END_COLUMN = 0
I_SCREEN_END_LINE = 0
IMPORTING
E_EXIT_CAUSED_BY_CALLER =
ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = itab
EXCEPTIONS
program_error = 1
OTHERS = 2
IF sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
FORM user_command USING ucomm LIKE sy-ucomm
selfield TYPE slis_selfield.
IF ucomm = 'DELE'.
LOOP AT iTAB WHERE CHECKbox = 'X' .
ENDLOOP.
MODIFY ztEST FROM TABLE itAB.
ENDIF.
selfield-refresh = 'X'.
ENDFORM.
NOW I HAVE A LIST O/P WHERE I CAN SELECT THE BOX AND CLICK DELETE ICON.
NOW I WANT TO CHANGE TO GRID, SO I KEPT EVERYTHING SAMRE AND I CHANGED " LIST" TO "GRID"
NOW TWO THINGS HAPPEND
1) I SEE A EMPTY COLUMN IN THE O/P , I GUESS THATS BECAUSE CHECKBOSX IN INTERNAL TABLE , SO I REMOVED IT
SO THIS MADE ME TO REMOVE
IF ucomm = 'DELE'.
LOOP AT iTAB." WHERE CHECKbox = 'X' .------PROBLEM
ENDLOOP.
MODIFY ztEST FROM TABLE itAB.
ENDIF.
selfield-refresh = 'X'.
NOW I DON'T SEE THE EMPTY COLUMN , BUT NOW PROBLEM IS I CANNNOT DISTINGUISH AS TO WHICH IS SELECTED AND AT ANY POINT OF TIME I CANSELECT ONLY ROW.
ALL I WANT IS
1) I WANT TO SELECT MULTIPLE ROWS AND SHOULD BE ABLE TO KNOW WHICH ROWS WERE SELECTED IN THE O/P SCREEN.
IN THE LIST DISPLAY I HAD CHECKBOX = 'X' FOR ALL THE ROWS THAT WERE SELECTED , I WANT THE SIMILAR THING in grid display
LET ME KNOW whether this can be done without USING 00 LANG.
thanksHi Swati,
Below code might help full for you. Description: is It selects multiple rows from ALV and display it on the next ALV.
*************************Reward Point If help full********************************************
*& Report z7cc_alv_oops_show_next_alv *
*& DEVELOPERS NAME : CHIDANAND CHAUHAN
*& DATE: SATURDAY 08-07-2006
*& DESCRIPTION: TO CREATE AN OBJECT ORIENTED ALV
REPORT z7cc_alv_oops_show_next_alv MESSAGE-ID z5hs .
DATA : BEGIN OF it_mara OCCURS 0,
mark TYPE flag,
matnr TYPE matnr,
mtart TYPE mtart,
meins TYPE meins,
END OF it_mara.
DATA : BEGIN OF it_mara1 OCCURS 0,
* mark type flag,
matnr TYPE matnr,
mtart TYPE mtart,
meins TYPE meins,
END OF it_mara1.
DATA : BEGIN OF it_mara2 OCCURS 0,
* mark type flag,
matnr TYPE matnr,
mtart TYPE mtart,
meins TYPE meins,
END OF it_mara2.
DATA : t_fieldcat TYPE lvc_t_fcat,
t_fieldcat1 TYPE lvc_t_fcat,
s_fieldcat LIKE LINE OF t_fieldcat.
DATA : s_layout TYPE lvc_s_layo.
DATA : control TYPE REF TO cl_gui_custom_container,
grid TYPE REF TO cl_gui_alv_grid.
DATA: BEGIN OF wa ,
mark TYPE flag,
matnr TYPE matnr,
mtart TYPE mtart,
meins TYPE meins,
END OF wa.
* CLASS lcl_events_box DEFINITION
CLASS lcl_events_box DEFINITION.
PUBLIC SECTION.
METHODS :
*Handler_Data_Changed for event Data_Changed of cl_gui_alv_grid
*imporTing er_data_changed,
handler_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm,
handler_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
ENDCLASS. "lcl_events_box DEFINITION
* CLASS lcl_events_box IMPLEMENTATION
CLASS lcl_events_box IMPLEMENTATION.
* method to handle the user command.
METHOD handler_user_command.
PERFORM form_usercommand CHANGING e_ucomm.
ENDMETHOD. "Handler_user_command
*& Mehod to handle the toolbar.
METHOD handler_toolbar.
PERFORM form_toolbar CHANGING e_object e_interactive
e_object->mt_toolbar.
ENDMETHOD. "Handler_ToolBar
ENDCLASS. "lcl_events_box IMPLEMENTATION
START-OF-SELECTION.
DATA : w_events TYPE REF TO lcl_events_box.
SELECT matnr mtart meins FROM mara INTO CORRESPONDING FIELDS OF TABLE
it_mara.
CALL SCREEN 100.
*& Module pbo_module OUTPUT
* text
MODULE pbo_module OUTPUT.
IF grid IS INITIAL.
CREATE OBJECT control
EXPORTING
container_name = 'CUST_CTRL'.
CREATE OBJECT grid
EXPORTING
i_parent = control.
PERFORM build_catalog.
PERFORM build_catalog1.
PERFORM build_layout.
CALL METHOD grid->set_table_for_first_display
EXPORTING
is_layout = s_layout
CHANGING
it_outtab = it_mara[]
it_fieldcatalog = t_fieldcat.
CREATE OBJECT w_events.
SET HANDLER : w_events->handler_toolbar FOR grid,
w_events->handler_user_command FOR grid.
CALL METHOD grid->set_toolbar_interactive.
ELSE.
CALL METHOD grid->refresh_table_display.
ENDIF.
ENDMODULE. " pbo_module OUTPUT
*& Form BUILD_CATALOG
FORM build_catalog .
s_fieldcat-col_pos = '1'.
s_fieldcat-fieldname = 'MARK'.
s_fieldcat-checkbox = 'X'.
s_fieldcat-edit = 'X'.
APPEND s_fieldcat TO t_fieldcat.
CLEAR s_fieldcat.
s_fieldcat-col_pos = '2'.
s_fieldcat-fieldname = 'MATNR'.
s_fieldcat-scrtext_m = 'MATERIAL'.
APPEND s_fieldcat TO t_fieldcat.
s_fieldcat-col_pos = '3'.
s_fieldcat-fieldname = 'MTART'.
s_fieldcat-scrtext_m = 'MATERL TYPE'.
APPEND s_fieldcat TO t_fieldcat.
s_fieldcat-col_pos = '4'.
s_fieldcat-fieldname = 'MEINS'.
s_fieldcat-scrtext_m = 'UOM'.
APPEND s_fieldcat TO t_fieldcat.
ENDFORM. " BUILD_CATALOG
*& Form BUILD_LAYOUT
* text
* --> p1 text
* <-- p2 text
FORM build_layout .
s_layout-zebra = 'X'.
* S_LAYOUT-CWIDTH_OPT = 'X'.
s_layout-grid_title = 'Material Details'.
ENDFORM. "BUILD_LAYOUT
" BUILD_LAYOUT////////////////////////////////////
" USER_COMMAND_0100 INPUT
*& Form FORM_USERCOMMAND
* text
* <--P_E_UCOMM text
FORM form_usercommand CHANGING p_e_ucomm.
CASE p_e_ucomm.
WHEN 'INT1'.
DO.
READ TABLE it_mara INDEX sy-index TRANSPORTING mark matnr.
IF sy-subrc <> 0.
EXIT.
ENDIF.
IF it_mara-mark = 'X'.
READ TABLE it_mara INTO wa TRANSPORTING matnr mtart meins .
MOVE-CORRESPONDING wa TO it_mara1.
READ TABLE it_mara1 TRANSPORTING matnr mtart meins .
MOVE-CORRESPONDING it_mara1 TO it_mara2.
APPEND it_mara2.
CALL METHOD grid->set_table_for_first_display
EXPORTING
is_layout = s_layout
CHANGING
it_outtab = it_mara2[]
it_fieldcatalog = t_fieldcat1.
* SET PARAMETER ID 'MAT' FIELD IT_MARA-MATNR.
* CALL TRANSACTION 'MM02'.
ENDIF.
* ENDIF.
ENDDO.
ENDCASE.
ENDFORM. " FORM_USERCOMMAND
*& Form FORM_TOOLBAR
* text
* <--P_E_OBJECT text
* <--P_E_INTERACTIVE text
* <--P_E_OBJECT_>MT_TOOLBAR text
FORM form_toolbar CHANGING p_e_object TYPE REF TO
cl_alv_event_toolbar_set
p_e_interactive
mt_toolbar TYPE ttb_button.
DATA wal_button TYPE stb_button.
*WAL_BUTTON-ICON = ICON_status_reverse.
wal_button-text = 'GO'.
wal_button-quickinfo = 'PROCEED'.
wal_button-function = 'INT1'.
wal_button-butn_type = 0.
wal_button-disabled = space.
INSERT wal_button INTO p_e_object->mt_toolbar INDEX 1.
ENDFORM. " FORM_TOOLBAR
*& Module PF-STATUS OUTPUT
* text
MODULE pf-status OUTPUT.
SET PF-STATUS 'Z7CCSTAT'.
ENDMODULE. " PF-STATUS OUTPUT
*& Module USER_COMMAND_0100 INPUT
* text
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*& Form BUILD_CATALOG1
* text
* --> p1 text
* <-- p2 text
FORM build_catalog1 .
s_fieldcat-col_pos = '1'.
s_fieldcat-fieldname = 'MATNR'.
s_fieldcat-scrtext_m = 'MATERIAL'.
APPEND s_fieldcat TO t_fieldcat1.
s_fieldcat-col_pos = '2'.
s_fieldcat-fieldname = 'MTART'.
s_fieldcat-scrtext_m = 'MATERL TYPE'.
APPEND s_fieldcat TO t_fieldcat1.
s_fieldcat-col_pos = '3'.
s_fieldcat-fieldname = 'MEINS'.
s_fieldcat-scrtext_m = 'UOM'.
APPEND s_fieldcat TO t_fieldcat1.
ENDFORM. " BUILD_CATALOG1 -
ORA-01427: single-row subquery returns more than one row HELP
I need to update baemployee.Stock_nbr field with select substr(C.CHECK_DIGIT, 3, 10)
from EMP_CHECK_DIG c where C.EMPLOYEE = e.EMPLOYEE
Please help.
update baemployee e
set Stock_nbr = (select substr(C.CHECK_DIGIT, 3, 10)
from EMP_CHECK_DIG c where C.EMPLOYEE = e.EMPLOYEE)
where exists
(select C.CHECK_DIGIT
from EMP_CHECK_DIG c where C.EMPLOYEE = e.EMPLOYEE)
and exists (select 1 from EMPLOYEE ee where ee.employee = e.employee and ee.emp_status like 'A%');
ORA-01427: single-row subquery returns more than one rowHi,
Welcome to the forum!
Whenever you have a question, please post some sample data, so that people can re-create the problem and test their solutions.
CREATE TABLE and INSERT statements, like the ones below, are great:
CREATE TABLE baemployee
( employee NUMBER (4)
, stock_nbr VARCHAR2 (10)
INSERT INTO baemployee (employee, stock_nbr) VALUES (1234, 'FUBAR');
CREATE TABLE employee
( employee NUMBER (4)
, emp_status VARCHAR2 (10)
INSERT INTO employee (employee, emp_status) VALUES (1234, 'ACTIVE');CREATE TABLE AS is good, too:
CREATE TABLE emp_check_dig
AS SELECT 1234 AS employee, 'AA1234567890ZZZ' AS check_digit FROM dual
UNION ALL SELECT 1234, 'AA2121212121ZZZ' FROM dual
;Also post the results you want from that data. In this case, the results would be the contents of the baemployee table after you run the UPDATE.
Would you want:
employee stock_nbr
1234 1234567890or would you want
employee stock_nbr
1234 2121212121If you run the UPDATE statement you posted with the data above, you'll get the "ORA-01427: single-row subquery returns more than one row" error, and you can see what causes it: there is more than one row from emp_check_dig that could be used to UPDATE the same row of baemployee. Say what you want to do in this situation (and why), and someone will help you find a way to do it. -
i'm using the following select-query:
select distinct a.ID,
a.date,
c.seg,
a.critical,
b.status,
a.Lnr,
(select pnr from vs_parts where vs = a.ID) as partnr,
a.prob
from VS a, VS_STATUS b, VS_Seg c, WE_B e
where a.status_id = b.id
and a.seg_id = d.VS_Seg_ID
the problem is, that the subquery (select pnr from vs_parts where vs = a.ID) returns multiple rows, which i need and want to show in one cell in the report.
but apex returns error: "ORA-01427: Subquery for one row returns more the one row" (Berichtsfehler: ORA-01427: Unterabfrage für eine Zeile liefert mehr als eine Zeile).
How can i get these multiple rows from the subquery in one cell in the report?
simisonSimplest way is to write a function, then you can format the output however you want it as well.
Pseudo:
myFunc(theID)
define strOutput varchar(2)
select pnr from vs_parts where vs = theID
for each row
strOutput = strOutput + pnr
loop
return strOutput
Message was edited by:
BigPhil -
HELP - Nested Case Question (Multiple Rows)
OK, Now that the syntax has been corrected with the help of "Chanchal Wankhade" (Thank you very much!), I have an entirely new issue. I am sure this issue has to do with my case statement logic. I am getting multiple rows, when I am only looking for one. Here is my code:
SELECT
CASE
WHEN EP.PHYSICAL_DATE IS NULL
THEN
CASE
WHEN EC.ORIGINAL_CONTRACT_START < ((SYSDATE) - 365)
THEN 'NEEDS PHYSICAL'
WHEN EC.ORIGINAL_CONTRACT_START < ((SYSDATE) - 330)
THEN 'COMING UP'
ELSE 'No'
END
WHEN EP.PHYSICAL_DATE IS NOT NULL
THEN
CASE
WHEN MAX(EP.PHYSICAL_DATE) KEEP (DENSE_RANK LAST ORDER BY EP.PHYSICAL_DATE) < ((SYSDATE) - 365)
THEN 'NEEDS PHYSICAL'
WHEN MAX(EP.PHYSICAL_DATE) KEEP (DENSE_RANK LAST ORDER BY EP.PHYSICAL_DATE) < ((SYSDATE) - 330)
THEN 'COMING UP'
ELSE 'No'
END
END "Needs Physical?"
FROM AP AE
LEFT JOIN EMP_PHYSICAL EP
ON AE.EMP_ID = EP.EMP_ID
LEFT JOIN POSITION_OFFERED PO
ON AE.EMP_ID = PO.EMP_ID
LEFT JOIN EMP_CONTRACT EC
ON AE.EMP_ID = EC.EMP_ID
WHERE PO.ACTUAL_END IS NULL
AND (EP.PHYSICAL = 1
OR EP.PHYSICAL IS NULL)
AND :P71_EMP_ID = AE.EMP_ID
GROUP BY EP.PHYSICAL_DATE, EC.ORIGINAL_CONTRACT_START;The OUTPUT is:
Needs Physical?
Row 1 NEEDS PHYSICAL
Row 2 No
However, only one of these rows should be the output, which is "No". How do you get a nested case statement to evaluate to one result, instead of multiple? I'm quite sure it is in the logic. To spell it out, this is what I am trying to accomplish with the above code:
If the "EP.PHYSICAL_DATE" is null, then use these sets of formula's to evalute the output, BUT if the "EP.PHYSICAL_DATE" is not null, then use these set's of formula's to evaluate the output.
As it stands now, it appears as if my nested case statement is doing exactly what I told it to do, which is to evaluate both conditions, and output both.
Any help would be appreciated. Thanks.
Aqua
Edited by: AquaNX4 on Mar 26, 2013 6:30 AMIf you define your service_level as a table then it will be much easier.
with service_level
as
select 'ALL' parent_lvl, 'Sergeant' srv_lvl from dual union all
select 'ALL', 'Bonus I' from dual union all
select 'ALL', 'Deputy Bailiff' from dual union all
select 'ALL', 'Deputy Lockup' from dual union all
select 'ALL', 'Deputy Bailiff Security' from dual union all
select 'ALL', 'Custody Assistant' from dual union all
select 'ALL', 'Security Officer' from dual union all
select 'ALL', 'Security Assistant' from dual union all
select 'ALL', 'Security Officer and Security Assistant' from dual union all
select 'ALL', 'Private Security' from dual union all
select 'All Deputies', 'Deputy Bailiff' srv_lvl from dual union all
select 'All Deputies', 'Deputy Bailiff Security' from dual union all
select 'All Deputies', 'Deputy Lockup' from dual union all
select 'All Sworn', 'Sergeant' srv_lvl from dual union all
select 'All Sworn','Bonus I' from dual union all
select 'All Sworn','All Deputies' from dual union all
select 'All Sworn','Deputy Bailiff' from dual union all
select 'All Sworn','Deputy Lockup' from dual union all
select 'All Sworn','Deputy Bailiff Security' from dual
select *
from in_service
where rank IN (
select srv_lvl
from service_level
where upper(parent_lvl) = upper(:SL)
or upper(srv_lvl) = upper(:SL)
) -
Insert statement with subquery to insert multiple rows
Hi frnds,
Kindly find the below mentioned query and error. Also suggest me to go ahead.
SQL> INSERT INTO FM_TRAN_DOC_NO (TDOC_COMP_CODE,
2 TDOC_TRAN_CODE,
3 TDOC_ACNT_YEAR,
4 TDOC_CUR_NO,
5 TDOC_MAX_NO,
6 TDOC_CAL_YEAR,
7 TDOC_PERIOD,
8 TDOC_DIVN_CODE,
9 TDOC_DEPT_CODE,
10 TDOC_CR_UID,
11 TDOC_CR_DT,
12 TDOC_UPD_UID,
13 TDOC_UPD_DT)
14 SELECT '001',
15 (SELECT DISTINCT TDOC_TRAN_CODE FROM FM_TRAN_DOC_NO
16 '6',
17 '0',
18 '9999',
19 NULL,
20 NULL,
21 NULL,
22 NULL,
23 'AGT',
24 TO_DATE (SYSDATE),
25 NULL,
26 TO_DATE (SYSDATE) FROM DUAL;
(SELECT DISTINCT TDOC_TRAN_CODE FROM FM_TRAN_DOC_NO ),
ERROR at line 15:
ORA-01427: single-row subquery returns more than one rowThis "SELECT DISTINCT TDOC_TRAN_CODE FROM FM_TRAN_DOC_NO" query returns multiple rows. So what is your requirement?
Try the below insert if you want to select from tale FM_TRAN_DOC_NO
INSERT INTO FM_TRAN_DOC_NO (TDOC_TRAN_CODE,
TDOC_COMP_CODE,
TDOC_ACNT_YEAR,
TDOC_CUR_NO,
TDOC_MAX_NO,
TDOC_CAL_YEAR,
TDOC_PERIOD,
TDOC_DIVN_CODE,
TDOC_DEPT_CODE,
TDOC_CR_UID,
TDOC_CR_DT,
TDOC_UPD_UID,
TDOC_UPD_DT)
SELECT DISTINCT
TDOC_TRAN_CODE
'001',
'6',
'0',
'9999',
NULL,
NULL,
NULL,
NULL,
'AGT',
TO_DATE (SYSDATE),
NULL,
TO_DATE (SYSDATE) FROM TDOC_TRAN_CODE;
Message was edited by: 000000 -
Please - immediate help needed parsing csv values into multiple rows
Hello, we have a very immediate need to be able to parse out a field of comma separated values into individual rows. The following is an example written in SQL Server syntax which does not work in Oracle.
The tricky part is that each ROUTES can be a different length, and each CSV can have a different number of routes in it.
Here is an example of the table ("Quotes") of CSV values I want to normalize:
TPNUMBER ROUTES
1001 1, 56W, 18
1002 2, 16, 186, 28
Here is an example of what I need it to look like:
TPNUMBER ROUTES
1001 1
1001 56W
1001 18
1002 2
1002 16
1002 186
1002 28
Here is the "Tally" table for the query below:
ID
1
2
3
4
5
6
7
And finally, here is the query which parses CSV values into multiple rows but which does not work in Oralce:
SELECT TPNUMBER,
NullIf(SubString(',' + ROUTES + ',' , ID , CharIndex(',' , ',' + ROUTES + ',' , ID) - ID) , '') AS ONEROUTE
FROM Tally, Quotes
WHERE ID <= Len(',' + ROUTES + ',') AND SubString(',' + Phrase + ',' , ID - 1, 1) = ','
AND CharIndex(',' , ',' + ROUTES + ',' , ID) - ID > 0
It may be necessary to use a cursor to loop through the CSV table and process each row (a loop within another loop...) but this is beyond my comprehesion of PL/SQL.
Many thanks in advance for your advice/help.
apkNot sure what you are trying to do with the last step, but this should work for the first part. I assume you would use sqlldr but I just did inserts instead. You might need more than 5 "routes" in the csv. You could put some reasonable max on that number of columns:
SQL>create table t_csv
2 (TPNUMBER varchar2(20),
3 ROUTE_1 VARCHAR2(5),
4 ROUTE_2 VARCHAR2(5),
5 ROUTE_3 VARCHAR2(5),
6 ROUTE_4 VARCHAR2(5),
7 ROUTE_5 VARCHAR2(5),
8 ROUTE_6 VARCHAR2(5) );
Table created.
SQL>INSERT INTO t_csv (TPNUMBER,ROUTE_1,ROUTE_2) values( '1001 1', '56W', '18' );
1 row created.
SQL>INSERT INTO t_csv (TPNUMBER,ROUTE_1,ROUTE_2,ROUTE_3) values( '1002 2', '16', '186', '28');
1 row created.
SQL>create table t_quotes(
2 tpnumber NUMBER,
3 routes VARCHAR2(5));
Table created.
SQL>DECLARE
2 L_tpnumber NUMBER;
3 L_route VARCHAR2(5);
4 begin
5 for rec in (select * from t_csv) loop
6 L_tpnumber := SUBSTR(rec.tpnumber,1,INSTR(rec.tpnumber,' ')-1);
7 L_route := SUBSTR(rec.tpnumber,INSTR(rec.tpnumber,' ')+1);
8 insert into t_quotes values( L_tpnumber, l_route );
9 if rec.route_1 is not null then
10 insert into t_quotes values( L_tpnumber, rec.route_1 );
11 end if;
12 if rec.route_2 is not null then
13 insert into t_quotes values( L_tpnumber, rec.route_2 );
14 end if;
15 if rec.route_3 is not null then
16 insert into t_quotes values( L_tpnumber, rec.route_3 );
17 end if;
18 if rec.route_4 is not null then
19 insert into t_quotes values( L_tpnumber, rec.route_4 );
20 end if;
21 if rec.route_5 is not null then
22 insert into t_quotes values( L_tpnumber, rec.route_5 );
23 end if;
24 end loop;
25 end;
26 /
PL/SQL procedure successfully completed.
SQL> select tpnumber, routes from t_quotes;
TPNUMBER ROUTE
1001 1
1001 56W
1001 18
1002 2
1002 16
1002 186
1002 28
7 rows selected. -
Multiple rows insertion - need help
Hello all,
I need to insert multiple rows in a table with a single query and the number of rows is 269470.
There are 3 columns in the table. One of the columns is determined by another sub query which returns multilple(269470) rows and the other 2 columns remain same for all.
I came up with the following query but need a loop to make it run multiple time(269470 times).
insert into EMLUSRRECV
(user_id, storeent_id, receiveml)
values
((select user_id from users where user_id not in (select distinct user_id from EMLUSRRECV) and CURR = 'USD' and rownum = 1), 11154, 1);
Thanks in advance.
Edited by: 924585 on Feb 20, 2013 7:19 PM924585 wrote:
Hello all,
I need to insert multiple rows in a table with a single query and the number of rows is 269470.
There are 3 columns in the table. One of the columns is determined by another sub query which returns multilple(269470) rows and the other 2 columns remain same for all.
I came up with the following query but need a loop to make it run multiple time(269470 times).
insert into EMLUSRRECV
(user_id, storeent_id, receiveml)
values
((select user_id from users where user_id not in (select distinct user_id from EMLUSRRECV) and CURR = 'USD' and rownum = 1), 11154, 1);
Thanks in advance.
Edited by: 924585 on Feb 20, 2013 7:19 PMwhy not just:
insert into emlusrrecv
select user_id, 11154, 1
from users
where user_id not in (select user_id from EMLUSRRECV)
and CURR = 'USD' and rownum = 1)
Maybe you are looking for
-
Windows error message "Setup could not read the CD you inserted..."
I partitioned my Macbook HD using bootcamp assistant and allowed 32GB for the partition. Then I tried installing windows using the assistant. I only get as far as verifying the windows CD (not far as which file system to use FAT32 or NTFS). Then I re
-
Hi All, How to find personnel number (PERNR )using SAP logon username(SY-UNAME)? Please let me know your thoughts.... Thanks & Regards Santhosh
-
OTN web page still says early adpter release 3
http://www.oracle.com/technology/index.html FEATURED DOWNLOADS Project Raptor Early Adopter Release 3 for Linux and Windows Should this be changed to Oracle SQL Developer (formerly Project Raptor) Early Adopter Release 4?
-
Offline Mobile PDA application
We are looking to develop an oracle mobile application on PDA's so that data can be entered offline and then later this data synchronized with the main db. After a brief look at Oracle lite docs it seems this may be the answer. As a newbie to both or
-
2LIS_11_VAHDR Data Load Issue
Hello Gurus, I have a cube which sources data from InfoSource 2LIS_11_VAHDR. ( It also sources from 2LIS_11_VAITM. ) The data-source, infopackage, update-rules etc. all is inplace. (a)<b> In Monitor:</b> Whenever I try to load data, in RSMO, I get -