SQL Server - Reformat query output to get a list of values into one column - format

I'm trying to get a list of values into a specific column. I'm able to get the data, but my report needs to have a specific structure based on the Supplier Code and Operation Number (Op_No) columns. The goal is to get all "child" values from the Resource column, and create a string that will populate the Resource column where the Supplier Code is not Null; i.e., Monroe, Jackson, Dallas, Jackson. Ideally, my report would look like "2" below. Any suggestion would be greatly appreciated.
Thank you!
The code below generates part "1" of the screen print.
CREATE TABLE #OPERATIONS ( Supplier_Code VARCHAR(50), Processor
VARCHAR(25), Work_Order VARCHAR(20), Customer VARCHAR(35),
Operation_Type VARCHAR(35), Op_Code INT, Resource VARCHAR(5))
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES ('Monroe','102482','24023', NULL, 'SUBCONTRACT', NULL ,' ') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL,NULL,'24023',NULL,'SUBCONTRACT', 250, 'RM') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES ('Jackson', '100162',NULL,'24023','SUBCONTRACT',NULL ,'') ;
INSERT INTO > #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL,NULL,'24023',NULL,'SUBCONTRACT',400,'CH') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL,NULL,'24023', NULL,'SUBCONTRACT', 500 , 'ST') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL,NULL, '24023'NULL,'SUBCONTRACT',550 ,'AU') ;
INSERT INTO > #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES ('Dallas','101514','24023', NULL, 'SUBCONTRACT',NULL ,' ') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES ('Jackson','100162','24023', NULL,'SUBCONTRACT',NULL ,' ') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL,NULL,'24023', NULL,'SUBCONTRACT', 650 ,'ST');
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL,NULL, '24023',NULL,'SUBCONTRACT', 700 ,'AU');
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL, NULL,'24023',NULL,'SUBCONTRACT' ,750,'TR') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL, NULL,'24023',NULL,'SUBCONTRACT' ,800,'EC') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL, NULL,'24023',NULL,'SUBCONTRACT' ,850,'HT') ;
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL, NULL,'24023',NULL,'SUBCONTRACT' ,900,'RW')
INSERT INTO #OPERATIONS (Supplier_Code, Processor, Work_Order,
Customer, Operation_Type, Op_Code, Resource)
VALUES (NULL, NULL,'24023',NULL,'SUBCONTRACT',950 ,'DM') ;
SELECT * FROM #OPERATIONS O

Related

Oracle SQL - Remove Null rows in aliased results

Hi devs I'm developing a small pro bono project that's use oracle sql but I'm not able to hide the null results.
Table Structure:
CREATE TABLE "church-members" (
ID NUMBER(10),
NAME varchar(30) NOT NULL,
LOGIN varchar(20) NOT NULL,
PASS varchar(12) NOT NULL,
REGISTER_YEAR_MONTH varchar(15) NOT NULL,
USER_SCORE NUMBER(10),
PRIMARY KEY (ID));
The queries:
INSERT INTO "church-members" VALUES
('1', 'John Doe', 'John', 'Xo8*d_d%f58*', '202204','1');
INSERT INTO "church-members" VALUES
('2', 'Mary Doe', 'Mary', 'dLoc&257dsew', '202203','2');
INSERT INTO "church-members" VALUES
('3', 'Robertson III', 'Robertson', 'koIIf59*Liu*', '202203','7');
INSERT INTO "church-members" VALUES
('4', 'Sonia MacDonald', 'Sonia', 'fYhfgtdjfi%', '202204','4');
INSERT INTO "church-members" VALUES
('5', 'Boris Johnston', 'Boris', 'do*&flddkIK%', '202201','2');
INSERT INTO "church-members" VALUES
('6', 'Ruth Henderson', 'Ruth', 'dF6%*&', '202202','2');
The Select:
SELECT
ID,
NAME,
LOGIN,
MAX(CASE WHEN REGISTER_YEAR_MONTH = '202203' THEN TO_CHAR(USER_SCORE) ELSE '' END) AS "MARCH SCORE",
MAX(CASE WHEN REGISTER_YEAR_MONTH = '202204' THEN TO_CHAR(USER_SCORE) ELSE '' END) AS "APRIL SCORE "
FROM
"church-members"
GROUP BY
ID,
NAME,
LOGIN
And the result fiddle:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=a4deac5e3eefb17dca97661552458a61
I got to this point using the information obtained in the answer from this link:
Select more than one column and remove NULL values from result
Looking at the fiddle example, the results with IDs 5 and 6 should not be showing because both are nulls.
But still null results are being shown...
Can anyone help me to solve it?
Add a HAVING clause requiring that each matching ID have at least data for at least one of the two months:
SELECT ID, NAME, LOGIN,
MAX(CASE WHEN REGISTER_YEAR_MONTH = '202203' THEN TO_CHAR(USER_SCORE) END) AS "MARCH SCORE",
MAX(CASE WHEN REGISTER_YEAR_MONTH = '202204' THEN TO_CHAR(USER_SCORE) END) AS "APRIL SCORE"
FROM "church-members"
GROUP BY ID, NAME, LOGIN
HAVING COUNT(CASE WHEN REGISTER_YEAR_MONTH IN ('202203', '202204') THEN 1 END) > 0;

ORA-01722 invalid number error message in SQL Developer

This is my table:
--Create Person Table
CREATE TABLE Person
(
Person_ID NUMBER(10) PRIMARY KEY,
First_Name NUMBER(15) NULL,
Last_Name VARCHAR2(15) NULL,
Middle_Name VARCHAR2(15) NULL,
Street_Address VARCHAR(35) NULL,
City VARCHAR2(10) NULL,
State VARCHAR2(2) NULL,
Zipcode VARCHAR2(5) NULL,
Country CHAR(2) NOT NULL,
Birth_Date DATE NOT NULL,
Gender CHAR(1) NOT NULL,
Phone VARCHAR2(10) NULL,
Email VARCHAR2(25) NULL,
Is_Patient CHAR(1) NULL,
Is_Physician CHAR(1) NULL,
Is_Employee CHAR(1) NULL,
Is_Volunteer CHAR(1) NULL
);
And I am trying to insert:
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12333', 'Victoria', 'Tirado', 'Amanda', '1951 Lane Drive', 'Bronx', 'NY', '10467', 'US', TO_DATE('8/4/1999',
'DD/MM/YYYY'),'F','7188751200', 'heyhey#gmail.com', 'N', 'N', 'N','Y');
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12444', 'Linda', 'Lewis', 'Dixon', '1366 Grey Lane', 'Bronx', 'NY', '10460', 'US', TO_DATE('7/17/1994',
'DD/MM/YYYY'),'F','7184561287', 'babygirl#gmail.com', 'N', 'N', 'N','Y');
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12555', 'Kristen', 'Wardell', 'Danielle', '8112 Noble Street', 'Bronx', 'NY', '10451', 'US', TO_DATE('10/6/1997',
'DD/MM/YYYY'),'F','7189451263', 'heygirl#gmail.com', 'N', 'N', 'N','Y');
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12666', 'Brittany', 'Edwards', 'Toni', '2264 Rosedale Lane', 'Bronx', 'NY', '10468', 'US', TO_DATE('4/21/1993',
'DD/MM/YYYY'),'F','7186552413', 'Itsme#gmail.com', 'N', 'N', 'N','Y');
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12777', 'Kristina', 'Goodwin', 'Sue', '1010 Beach Street', 'Bronx', 'NY', '10455', 'US', TO_DATE('5/11/1991',
'DD/MM/YYYY'),'F','7189478511', 'yougood#gmail.com', 'N', 'N', 'N','Y');
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12666', 'Rebecca', 'Gonzalez', 'Bianca', '8124 Elder Drive', 'Bronx', 'NY', '10474', 'US', TO_DATE('2/19/1996',
'DD/MM/YYYY'),'F','7181148792', 'artist#gmail.com', 'N', 'N', 'N','Y');
Select *
From PERSON;
But I am getting this message:
Error starting at line : 36 in command -
insert into PERSON
(Person_ID, First_Name, Last_Name, Middle_Name, Street_Address,
City, State, Zipcode, Country, Birth_Date, Gender, Phone,
Email, Is_Patient, Is_Physician, Is_Employee, Is_Volunteer)
values ('12666', 'Rebecca', 'Gonzalez', 'Bianca', '8124 Elder Drive', 'Bronx', 'NY', '10474', 'US', TO_DATE('2/19/1996',
'DD/MM/YYYY'),'F','7181148792', 'artist#gmail.com', 'N', 'N', 'N','Y')
Error report -
ORA-01722: invalid number
Is it because I accidentally made first name as Number(10) and not VarChar(10)?
Alter table person modify (first_name varchar2(15));
Then run your insert quety
Apart from the data type that you have already altered in the table, You also need to take care of the DATE.
You have used: TO_DATE('2/19/1996','DD/MM/YYYY'). It will throw an error: ORA-01843: not a valid month
It should be: TO_DATE('02/19/1996','DD/MM/YYYY')

Insert statement and create table oracle

My tables are been created, but when I am trying to put the insert statements it's giving me an error saying parent not found.
This is my create table:
Create table patient (
Patient_ID Number(9) primary key,
First_name varchar2(15),
Last_name varchar2(10),
Contact number(10),
City varchar2(20),
Doctor_ID Number(9) references Doctor(Doctor_ID)
);
This is the insert statement:
insert into patient (Patient_ID, First_name, Last_name, Contact, City, Doctor_ID) values ('21345', 'John', 'Smith', '1111111111', 'NY', '30111');
Try :
insert into patient (Patient_ID, First_name, Last_name, Contact, City, Doctor_ID) values (21345, 'John', 'Smith', 1111111111, 'NY', 30111);
Don't use quotes for numbers.

Dummy Results When Inserting Multiple Rows

I recently created a table called Movie_Stars. It contains 6 columns: Movie_Number number unique, Movie_Title varchar2 (30) unique, Year_Released date not null, First_Name varchar2 (15), Last_Name varchar2 (15), and Movie_Category varchar2 (15). I need to insert the following values into the table:
insert all
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (1, 'New York Stories', 'January 1 1984', Nick, Nolte, Drama)
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (2, 'Speed', '1999, FEB 12', Keanu, Reeves, Action)
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (3, 'Superman', '1982, MAR 7', Chris, Reeve, Action)
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (4, 'Ice Age', '2002, April 2', Chris, Rock, Cartoon)
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (5, 'Bowfinger', '2001, August 03', Eddie, Murphy, Comedy);
select * from dual;
However, when I ran the code, it returned the following results:
DUMMY
-----
1 x
What does that mean and how do I fix it?
You have a wrong semicolon between the INSERT ALL and the SELECT; this means that they are two different statements, not a single statement.
You are missing many quotes to wrap your string values
You can not insert date values this way; you have to use a to_date or use the ANSI standard
You can rewrite your code as:
insert all
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (1, 'New York Stories', date '1984-01-01', 'Nick', 'Nolte', 'Drama')
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (2, 'Speed', date '1992-02-12', 'Keanu', 'Reeves', 'Action')
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (3, 'Superman', date '1982-03-07', 'Chris', 'Reeve', 'Action')
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (4, 'Ice Age', to_date ('02/04/2002', 'dd/mm/yyyy'), 'Chris', 'Rock', 'Cartoon')
into movie_stars (movie_number, movie_title, year_released, first_name, last_name, movie_category)
values (5, 'Bowfinger', date '2001-08-03', 'Eddie', 'Murphy', 'Comedy')
select * from dual;

How to Duplicate multiple rows (Oracle)

I'm trying to make a Procedure that will duplicate multiple rows of a table (or only one single row) and incrementing the ID for each row insertion.
My problem is that inside my procedure I used a cursor to select the rows to duplicate, when i select all rows without WHERE condition in that cursor everything works fine.
But when i set a WHERE condition to select only one row... nothing happens
Here is my procedure
CREATE OR REPLACE PROCEDURE DuplicateEmployee (p_EmployeeID IN Employee.id%TYPE)
AS
p_New_EmployeeID Employee.id%TYPE;
CURSOR c_DuplicateEmployee IS
SELECT *
FROM Employee
WHERE Employee.id = p_EmployeeID; -- if this line is deleted all content is duplicated
row_Employee c_DuplicateEmployee%ROWTYPE;
BEGIN
FOR myEmployee IN c_DuplicateEmployee LOOP
p_New_EmployeeID := employee_seq.NEXTVAL;
INSERT INTO Employee(id, first_name, last_name, start_date, end_date, salary, city, description)
VALUES(p_New_EmployeeID, myEmployee.first_name, myEmployee.last_name, myEmployee.start_date, myEmployee.end_date, myEmployee.salary, myEmployee.city, myEmployee.description);
END LOOP;
COMMIT;
END DuplicateEmployee;
I know in this example having a procedure selecting a primary key to duplicate is pointless but in my production base it will be used to select a Foreign key.
Bellow is the code require to create a the test table and SEQUENCE I used for this procedure
CREATE TABLE Employee
(
ID VARCHAR2(4 BYTE) NOT NULL,
First_Name VARCHAR2(10 BYTE),
Last_Name VARCHAR2(10 BYTE),
Start_Date DATE,
End_Date DATE,
Salary NUMBER(8,2),
City VARCHAR2(10 BYTE),
Description VARCHAR2(15 BYTE)
);
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('01', 'Jason', 'Martin', to_date('19960725','YYYYMMDD'), to_date('20060725','YYYYMMDD'), 1234.56, 'Toronto', 'Programmer');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('02', 'Alison', 'Mathews', to_date('19760321','YYYYMMDD'), to_date('19860221','YYYYMMDD'), 6661.78, 'Vancouver', 'Tester');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('03', 'James', 'Smith', to_date('19781212','YYYYMMDD'), to_date('19900315','YYYYMMDD'), 6544.78, 'Vancouver', 'Tester');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('04', 'Celia', 'Rice', to_date('19821024','YYYYMMDD'), to_date('19990421','YYYYMMDD'), 2344.78, 'Vancouver', 'Manager');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('05', 'Robert', 'Black', to_date('19840115','YYYYMMDD'), to_date('19980808','YYYYMMDD'), 2334.78, 'Vancouver', 'Tester');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('06', 'Linda', 'Green', to_date('19870730','YYYYMMDD'), to_date('19960104','YYYYMMDD'), 4322.78, 'New York', 'Tester');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('07', 'David', 'Larry', to_date('19901231','YYYYMMDD'), to_date('19980212','YYYYMMDD'), 7897.78, 'New York', 'Manager');
INSERT
INTO Employee
(ID, First_Name, Last_Name, Start_Date, End_Date, Salary, City, Description)
VALUES
('08', 'James', 'Cat', to_date('19960917','YYYYMMDD'), to_date('20020415','YYYYMMDD'), 1232.78, 'Vancouver', 'Tester');
Here for the Sequence that will manage Primary key (ID)
CREATE SEQUENCE "TEST"."EMPLOYEE_SEQ" MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 NOCACHE ORDER NOCYCLE ;
And here the code to execute the procedure
BEGIN
employeepackage.duplicateemployee(5);
END;
I really don't understand why it doesn't properly work for a single row when it's working to plicate all rows ? It there a limitation for cursors having less than 2 rows ?
Any help would be much appreciated ;)
Why do you need a cursor? You can do this with SQL directly:
INSERT INTO Employee(id, first_name, last_name,
start_date, end_date,
salary, city, description)
SELECT employee_seq.NEXTVAL, e.first_name, e.last_name,
e.start_date, e.end_date,
e.salary, e.city, e.description
FROM Employee e
WHERE e.id = p_EmployeeID;
Anyway, the actual problem is that your ID is a VARCHAR2(4), whereas you think it is a NUMBER. You actually do not have an employee with ID = 5, but you do have one with ID = '05'. So without changing anything, your procedure already works:
BEGIN
employeepackage.duplicateemployee('05');
END;
Of course, it would make sense to change the data type of ID.
Solution from Lukas if fine for my first and last table that will not need to call others PROCEDURE to duplicate multiple children, though for intermediate table I used :
PROCEDURE Duplicate_Company (p_IdCity IN City.IdCity%TYPE) AS
p_New_IdCompany Company.IdCompany%TYPE;
CURSOR c_DuplicateCompany IS
SELECT *
FROM Company c
WHERE c.IdCity = p_IdCity;
row_Company c_DuplicateCompany%ROWTYPE;
BEGIN
FOR c1 IN c_DuplicateCompany LOOP
p_New_IdCompany := company_seq.NEXTVAL;
INSERT INTO Company(IdCompany, IdCity, Name, CreationDate)
VALUES(p_New_IdCompany, c1.IdCity, c1.Name, c1.CreationDate);
-- Call the procedure to duplicate current employee
Duplicate_Employee(c1.IdCompany);
END LOOP;
END Duplicate_Company;
Is it a good approach ?

Resources