April 27, 2007 at 2:07 pm
hi i need to pass a basic SQL test before i can get an interview for a company but I am pretty rusty with my syntax and have no live server to test my answers on. I have done most of it but I have a feeling a lot of what i have done is incorrect and i badly need help with the last 3 questions. Any help is greatly appreciated.
DDL for Schema:
CREATE TABLE DBTEST.JOBS
(
JOB_ID NUMBER(38) NOT NULL,
COMPANY_ID NUMBER(38) NOT NULL,
START_DATE DATE NOT NULL,
JOB_TYPE VARCHAR2(100) NOT NULL,
STATUS VARCHAR2(20) NOT NULL
)
CREATE TABLE DBTEST.SALARY_HISTORY
(
SALARY_HISTORY_ID NUMBER(38) NOT NULL,
SALARY NUMBER(7,2) NOT NULL,
START_DATE DATE NOT NULL,
END_DATE DATE NOT NULL,
EMPLOYEE_ID NUMBER(38) NOT NULL,
CONSTRAINT SYS_C0036283
FOREIGN KEY (EMPLOYEE_ID)
REFERENCES DBTEST.EMPLOYEES (EMPLOYEE_ID)
ENABLE
)
CREATE TABLE DBTEST.EMPLOYEES
(
EMPLOYEE_ID NUMBER(38) NOT NULL,
NAME VARCHAR2(40) NOT NULL,
MANAGER_ID NUMBER(38) NOT NULL,
JOB_ID NUMBER NULL,
CONSTRAINT FK_EMPLOYEE_JOB
FOREIGN KEY (JOB_ID)
REFERENCES DBTEST.JOBS (JOB_ID)
ENABLE
)
CREATE TABLE DBTEST.CURRENT_SALARY
(
CURRENT_SALARY_ID NUMBER(38) NOT NULL,
SALARY NUMBER(7,2) NOT NULL,
START_DATE DATE NOT NULL,
EMPLOYEE_ID NUMBER(38) NOT NULL,
CONSTRAINT SYS_C0036280
FOREIGN KEY (EMPLOYEE_ID)
REFERENCES DBTEST.EMPLOYEES (EMPLOYEE_ID)
ENABLE
)
Questions:
1.Provide a count of employees by manager id
2.Repeat the previous question but provide the managers name instead of the id
3.Repeat the previous query and order the output by the number of employees per manager
4.Repeat the previous query for managers with more than 2 employees
5.Provide a list of employees whose surname begins with ‘B’
6.Provide a list of employees ordered by highest current salary
7.Return a list of employees earning between £4000 and £5000
8.Get the Employee name of the longest serving employee. Using the min function. Assume all long serving employees will have a salary history.
9.Do the same query but use rownum instead of min.
10.Get a full (current and historical) salary history for the employee ‘Fred Brown’
Answers
1.CREATE VIEW EMPCOUNT_MANID (MANAGER_ID, NUM_OF_EMP)
SELECT MANAGER_ID, COUNT(MANAGER_ID) FROM EMPLOYEES
2.CREATE VIEW EMPCOUNT_MANNAME(NAME, NUM_OF_EMP)
SELECT NAME, COUNT(MANAGER_ID)
FROM EMPLOYEES
GROUP BY NAME
3.CREATE VIEW EMPCOUNT_MANNAME (NAME, NUM_OF_EMP)
SELECT COUNT(MANAGER_ID)
FROM EMPLOYEES
GROUP BY NAME
4.CREATE VIEW EMPCOUNT_MANNAME (NAME, NUM_OF_EMP)
SELECT COUNT(MANAGER_ID)
FROM EMPLOYEES
GROUP BY NAME
WHERE NUM_OF_EMP > 2
5.CREATE VIEW EMP_SURNAME (SURNAME_B)
SELECT NAME
FROM EMPLOYEES
WHERE NAME LIKE 'B%'
6.CREATE VIEW EMP_HIGHEST (ID, SALARY_HIGHEST)
SELECT EMP_ID, SALARY
FROM CURRENT_SALARY
ORDER BY SALARY DESC
7.CREATE VIEW EMP_HIGHEST (ID, SALARY_HIGHEST)
SELECT EMP_ID, SALARY
FROM CURRENT_SALARY
WHERE CURRENT_SALARY >= 4000 AND <= 5000
8.SELECT EMPLOYEES.NAME
WHERE
MIN(START_DATE), END_DATE
WHERE
9.
10. SELECT CURRENT_SALARY
April 27, 2007 at 3:15 pm
Cross post
--Jeff Moden
Change is inevitable... Change for the better is not.
April 30, 2007 at 3:13 am
ethically now allowed.
April 30, 2007 at 4:31 am
if ur not willing to help dont post up replies
April 30, 2007 at 5:28 am
The syntax for creating the VIEWs does not look like SQL Server syntax.
Which DBMS are you using?
Oracle or DB2? VARCHAR2 is not available in SQL Server.
Maybe you should try a different forum more suited for your DBMS.
N 56°04'39.16"
E 12°55'05.25"
April 30, 2007 at 4:18 pm
Oracle is my guess. Also the spelling and grammar in this cross post has magically improved. And who says cross-posting is now ethically allowed (apart from Muhammad Abbars of course) ?
DB
The systems fine with no users loggged in. Can we keep it that way ?br>
May 1, 2007 at 10:34 am
I think Muhammad meant "Ethically NOT allowed" in regards to asking for answers to interview questions.
-SQLBIll
May 1, 2007 at 4:02 pm
I'd agree with that, and apologise.
DB
The systems fine with no users loggged in. Can we keep it that way ?br>
May 7, 2007 at 9:32 am
While I agree with some of the other posts that nobody should take your test for you I'll assume you have a legitimate interested in learning the answers to these questions and are not simply going to plagiarize them. (If I'm wrong I doubt you would be able to get past the oral interview anyway). Based on the schema this looks like an Oracle DB, but since we are in a SQL Server forum I'll answer for a SQL Server DB.
Now having said that I hope I don't embarrass myself by making any really stupid mistakes here 🙂
--Q1. Count of employees by manager id
select manager_id, count(*)
from employees
group by manager_id
--Q2. Above with mangers name
select (select name from employees m where m.employee_id = e.manager_id), count(*)
from employees e
group by e.manager_id
--Q2. Same as above but with self join
--NOTE: Won't pickup any employees without a manager.
select m.name, count(*)
from employees e join employees m on (e.manager_id = m.employee_id)
group by m.name
--Q3. Above ordered by number of employees per manager (assuming highest to lowest)
select m.name, count(*)
from employees e join employees m on (e.employee_id = m.manager_id)
group by m.name
order by count(*) desc
--Q4. above for managers with more than 2 employees
select m.name, count(*)
from employees e join employees m on (e.employee_id = m.manager_id)
group by m.name
having count(*) > 2
order by count(*) desc
--Q5. List of employees with surnmaes beginning with B
--Assumption: SQL server is RDBMS (not sure if 'like' is ANSI standard), and all employee names are Last, First MI
select name
from employees
where name like 'B%'
--Q6. List of employees ordered by highest current salary
--Assumption: Current_Salary table is 1 to 1 with employee (not a good assumption)
select name, salary
from employees join current_salary
order by salary desc
--Q7. List of employees earning between 4000 and 5000
--Assumption: Salary is already in pounds not dollars
select name
from employees join current_salary
where salary between 4000 and 5000
--Q8. Name of longest serving employee
select name
from employees join salary_history
where start_date = (select min(start_date) from salary_history)
--Q9. Same as above but with rownum
--NOTE: I've only worked with oracle minimally so only have a passing familiarity with ROWNUM but my understanding
-- is physically part of each table and it increments upwards with each insert.
-- Therefore using that and the following assumption:
--Assumption: Records were inserted into employee table as they joined the company and have never been deleted/reorganized
--NOTE: I doubt this is what they are looking for, but from the question....
select min(rownum), name
from employees
--Q10. Current and historical salary for fred brown
--Assumption: To keep the query simply I'll assume the name field stores First Name Last Name now.
select name, salary
from employees join current_salary
where name = 'Fred Brown'
union
select name, salary
from employees join salary_history
where name = 'Fred Brown'
May 7, 2007 at 8:40 pm
Nice gesture... but a really, really bad thing to do...
--Jeff Moden
Change is inevitable... Change for the better is not.
May 17, 2007 at 8:44 am
Yes, and he hasn't even had the courtesy to say thank you. No doubt you've already added him to your mental list of users that you won't bother helping again... or am I the only one who has one of those?
John
May 17, 2007 at 8:51 am
Based on the dates I figured his interview had already passed, and based on his attempted answers he probably bombed badly and has moved on to another project. Though in fairness he did say he was not a SQL person, JUST and application developer , though I have never worked on an application that did not involve a database (guess that comes with only working on business applications).
James.
Viewing 12 posts - 1 through 11 (of 11 total)
You must be logged in to reply to this topic. Login to reply