SQL request error - sql
Good evening everyone,
I'm working on a assignment and can't figure out the following, I have two tables:
CREATE TABLE Rental (
rental_id DECIMAL(12) PRIMARY KEY,
customer_id DECIMAL(12),
movie_id DECIMAL(12),
delivery_status VARCHAR(64),
return_status VARCHAR(64));
and
CREATE TABLE Movie (
movie_id DECIMAL(12) PRIMARY KEY,
DVD_id INTEGER NOT NULL,
title VARCHAR(64) NOT NULL,
stock_number DECIMAL(12),
director_id DECIMAL(12),
genre_id DECIMAL(12),
release_date DATE NOT NULL,
restrictions VARCHAR(256) NOT NULL);
I need to do the following, list the names of all movies that are currently unavailable, rented and not yet returned. And this is my query:
SELECT Movie.movie_id, Movie.title, Movie.stock_number
FROM Movie
WHERE (Movie.movie_id, Movie.stock_number) NOT IN (
SELECT Rental.movie_id,
COUNT(Rental.return_status) AS number_of_unreturned
FROM Rental
WHERE Rental.return_status = 'Unreturned'
GROUP BY Rental.movie_id
HAVING COUNT (Rental.return_status) > 1) AND Movie.stock_number = 0;
I definitely have movies in Movie table that are not "Unreturend" but I get no rows selected all the time. Any advices or directions to think would be appreciated. Thanks!
I edited this post and added the content of the tables.
INSERT INTO Movie VALUES (1, 1, 'Amblin', 1, 1, 1, CAST('18-Dec-1968' AS DATE), 'G');
INSERT INTO Movie VALUES (2, 2, 'Duel', 2, 1, 2, CAST('13-Nov-1971' AS DATE), 'R');
INSERT INTO Movie VALUES (3, 3, 'Something Evil ', 3, 1, 3, CAST('21-Jan-1972' AS DATE), 'R');
INSERT INTO Movie VALUES (4, 4, 'The Sugarland Express ', 4, 1, 4, CAST('05-Apr-1974' AS DATE), 'PG13');
INSERT INTO Movie VALUES (5, 5, 'Jaws', 5, 1, 3, CAST('20-Jun-1975' AS DATE), 'R');
INSERT INTO Movie VALUES (6, 6, 'Close Encounters of the Third Kind', 6, 1, 5, CAST('16-Nov-1977' AS DATE), 'PG13');
INSERT INTO Movie VALUES (7, 7, ' 1941', 7, 1, 6, CAST('14-Dec-1979' AS DATE), 'G');
INSERT INTO Movie VALUES (8, 8, 'Raiders of the Lost Ark', 8, 1, 7, CAST('12-Jun-1981' AS DATE), 'PG13');
INSERT INTO Movie VALUES (9, 9, 'E.T. the Extra-Terrestrial', 9, 1, 5, CAST('11-Jun-1982' AS DATE), 'PG13');
INSERT INTO Movie VALUES (10, 10, 'Twilight Zone: The Movie', 10, 1, 3, CAST('24-Jun-1983' AS DATE), 'R');
INSERT INTO Movie VALUES (11, 11, 'Indiana Jones and the Temple of Doom', 11, 1, 7, CAST('23-May-1984' AS DATE), 'PG13');
INSERT INTO Movie VALUES (12, 12, 'The Color Purple', 12, 1, 4, CAST('18-Dec-1985' AS DATE), 'G');
INSERT INTO Movie VALUES (13, 13, 'Empire of the Sun', 13, 1, 4, CAST('25-Dec-1987' AS DATE), 'G');
INSERT INTO Movie VALUES (14, 14, 'Always', 14, 1, 4, CAST('22-Dec-1989' AS DATE), 'G');
INSERT INTO Movie VALUES (15, 15, 'Indiana Jones and the Last Crusade', 15, 1, 7, CAST('24-May-1989' AS DATE), 'G');
INSERT INTO Movie VALUES (16, 16, 'Hook', 16, 1, 8, CAST('11-Dec-1991' AS DATE), 'G');
INSERT INTO Movie VALUES (17, 17, 'Jurassic Park ', 17, 1, 5, CAST('11-Jun-1993' AS DATE), 'PG13');
INSERT INTO Movie VALUES (18, 18, 'Schindler''s List', 18, 1, 4, CAST('15-Dec-1993' AS DATE), 'PG13');
INSERT INTO Movie VALUES (19, 19, 'The Lost World: Jurassic Park', 19, 1, 5, CAST('23-May-1997' AS DATE), 'PG13');
INSERT INTO Movie VALUES (20, 20, 'Amistad', 20, 1, 4, CAST('10-Dec-1997' AS DATE), 'PG13');
INSERT INTO Movie VALUES (21, 21, 'Saving Private Ryan', 21, 1, 4, CAST('24-Jul-1998' AS DATE), 'PG13');
INSERT INTO Movie VALUES (22, 22, 'A.I. Artificial Intelligence', 22, 1, 4, CAST('29-Jun-2001' AS DATE), 'PG13');
INSERT INTO Movie VALUES (23, 23, 'Minority Report', 23, 1, 7, CAST('21-Jun-2002' AS DATE), 'PG13');
INSERT INTO Movie VALUES (24, 24, 'Catch Me If You Can', 24, 1, 8, CAST('25-Dec-2002' AS DATE), 'PG13');
INSERT INTO Movie VALUES (25, 25, ' The Terminal', 25, 1, 4, CAST('18-Jun-2004' AS DATE), 'G');
INSERT INTO Movie VALUES (26, 26, 'War of the Worlds', 26, 1, 5, CAST('29-Jun-2005' AS DATE), 'PG13');
INSERT INTO Movie VALUES (27, 27, 'Munich', 27, 1, 4, CAST('23-Dec-2005' AS DATE), 'PG13');
INSERT INTO Movie VALUES (28, 28, 'Indiana Jones and the Kingdom of the Crystal Skull', 28, 1, 7, CAST('22-May-2008' AS DATE), 'PG13');
INSERT INTO Movie VALUES (29, 29, 'The Adventures of Tintin', 28, 1, 7, CAST('21-Dec-2011' AS DATE), 'PG13');
INSERT INTO Movie VALUES (30, 30, 'War Horse', 30, 1, 4, CAST('25-Dec-2011' AS DATE), 'PG13');
INSERT INTO Movie VALUES (31, 31, 'Lincoln', 31, 1, 4, CAST('09-Nov-2012' AS DATE), 'PG13');
INSERT INTO Movie VALUES (32, 32, 'Bridge of Spies', 32, 1, 4, CAST('16-Oct-2015' AS DATE), 'PG13');
INSERT INTO Movie VALUES (33, 33, 'The BFG', 33, 1, 8, CAST('01-Jul-2016' AS DATE), 'PG13');
INSERT INTO Movie VALUES (34, 34, 'Praying with Anger', 34, 2, 5, CAST('12-Sep-1992' AS DATE), 'PG13');
INSERT INTO Movie VALUES (35, 35, 'Wide Awake', 35, 2, 4, CAST('20-Mar-1998' AS DATE), 'G');
INSERT INTO Movie VALUES (36, 36, 'The Sixth Sense', 36, 2, 2, CAST('06-Aug-1999' AS DATE), 'PG13');
INSERT INTO Movie VALUES (37, 37, 'Unbreakable', 37, 2, 2, CAST('22-Nov-2000' AS DATE), 'PG13');
INSERT INTO Movie VALUES (38, 38, 'Signs', 38, 2, 2, CAST('02-Aug-2002' AS DATE), 'PG13');
INSERT INTO Movie VALUES (39, 39, 'The Village', 39, 2, 2, CAST('30-Jul-2004' AS DATE), 'PG13');
INSERT INTO Movie VALUES (40, 40, 'Lady in the Water', 40, 2, 8, CAST('21-Jul-2006' AS DATE), 'PG13');
INSERT INTO Movie VALUES (41, 41, 'The Happening', 41, 2, 2, CAST('13-Jun-2008' AS DATE), 'R');
INSERT INTO Movie VALUES (42, 42, 'The Last Airbender', 42, 2, 7, CAST('02-Jul-2010' AS DATE), 'G');
INSERT INTO Movie VALUES (43, 43, 'After Earth', 43, 2, 7, CAST('31-May-2013' AS DATE), 'G');
INSERT INTO Movie VALUES (44, 44, 'The Visit', 44, 2, 3, CAST('11-Sep-2015' AS DATE), 'R');
INSERT INTO Movie VALUES (45, 45, 'Split', 45, 2, 2, CAST('20-Jan-2017' AS DATE), 'PG13');
and
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 1, 1, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 2, 1, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 3, 6, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 4, 7, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 2, 2, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 2, 37, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 1, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 24, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 3, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 13, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 2, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 8, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 6, 1, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 2, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 5, 3, 'Delivered', 'Unreturned');
INSERT INTO Rental VALUES (sequence_rental.NEXTVAL, 3, 27, 'Delivered', 'Returned');
Sorry if that is a too long post.
I don't want to write the code since you are a student. I'll give some direction though. In your where clause you're comparing (movie.movie_id = rental.movie_id) and (movie.stock_number = count(rental.return_status). Comparing the stock_number to the count of returns is incorrect.
When returning columns from multiple tables, use a join. The in statement does a comparison. Count is not being returned.
Join movies and the "in" subquery on movie_id. Create an alias on the subquery so you can join it.
Add the count column to the topmost outer select
Please try, if this logic is correct, I did not quite understand column naming. You might change last row (having) to correct it.
SELECT
m.movie_id, m.title, m.stock_number -- Getting movie id, movie title, stock number
FROM Movie m -- from movie table
JOIN rental r
ON (m.movie_id = r.movie_id) -- joining rental table in movie_id
WHERE
r.return_status = 'Unreturned' -- where return_status is unreturned
GROUP BY
m.movie_id, m.title, m.stock_number -- grouping_by (same as select)
HAVING
SUM(r.movie_id) > m.stock_number; -- restricting group by quantity
To resolve the query try first to break it down in the components you need.
In this case you need to compare the number of rented movies against the stock of movies.
So write 2 separte queries:
1 - One that will provide the movie id and the number to movies in stock.
2 - Another for the movie id and the number of rentals. For this one you have to count the unretured.
After you have the two queries, you can use them as subqueries of a higer level query that treats each or these queries as a table joined by the common id field.
And add awhere clause comparing the stock with the counted field.
Example:
Table A: id, name, age
Table B: table_b_id, table_a_id, telephone, address
Query 1: select id, name, age from A
Query 2: select table_a_id, telephone, address from B
select Q1.id, Q1.name, Q1.age, Q2telephone, Q2.address
from
(select A.id, A.name, A.age from A) Q1,
(select B.table_a_id, B.telephone, B.address from B) Q2
where
Q1.id = Q2.table_a_id
Related
summing by rows sql
I attempted to do it using the analytical function, but it appears that I did so improperly... How can I receive the output from the table I've been given? CREATE TABLE rides ( ride_id INT, driver_id INT, ride_in_kms INT, ride_fare FLOAT, ride_date DATE ); INSERT INTO rides VALUES (1, 1, 3, 4.45, "2016-05-16"); INSERT INTO rides VALUES (2, 1, 4, 8.46, "2016-05-16"); INSERT INTO rides VALUES (3, 2, 6, 11.9, "2016-05-16"); INSERT INTO rides VALUES (4, 3, 3, 6.76, "2016-05-16"); INSERT INTO rides VALUES (5, 2, 6, 13.55, "2016-05-16"); INSERT INTO rides VALUES (6, 4, 3, 4.91, "2016-05-20"); INSERT INTO rides VALUES (7, 1, 7, 16.77, "2016-05-20"); INSERT INTO rides VALUES (8, 3, 9, 16.18, "2016-05-20"); INSERT INTO rides VALUES (9, 2, 3, 6.07, "2016-05-20"); INSERT INTO rides VALUES (10, 4, 4, 6.25, "2016-05-20"); Output result Thanks in advance
The general gist is to use an expression within the sum() to operate on the correct rows: select driver_id, sum(case when ride_date = "2016-05-16" then ride_in_kms else 0 end) `KMS_MAY_16`, sum(case when ride_date = "2016-05-20" then ride_in_kms else 0 end) `KMS_MAY_20` from group by driver_id; The particular syntax available, and how to express the column label depends on what database you are using.
Counting id for both days SQL
Can anyone help me, please? The task is to find the number of rides taken by drivers who took a ride on both days create table rides ( ride_id int, driver_id int, ride_in_kms int, ride_fare float, ride_date date ); insert into rides values (1, 1, 3, 4.45, "2016-05-16"); insert into rides values (2, 1, 4, 8.46, "2016-05-16"); insert into rides values (3, 2, 6, 11.9, "2016-05-16"); insert into rides values (4, 3, 3, 6.76, "2016-05-16"); insert into rides values (5, 2, 6, 13.55, "2016-05-16"); insert into rides values (6, 4, 3, 4.91, "2016-05-20"); insert into rides values (7, 1, 7, 16.77, "2016-05-20"); insert into rides values (8, 3, 9, 16.18, "2016-05-20"); insert into rides values (9, 2, 3, 6.07, "2016-05-20"); insert into rides values (10, 4, 4, 6.25, "2016-05-20"); The output: driver_id rides -------------- 1 3 2 3 3 2
try like below select driver_id,count(*) as cnt from rides group by driver_id having count(distinct ride_date) > 1
select driver_id ,count( ride_id) as rides from rides group by driver_id having driver_id in (select driver_id from rides where ride_date ="2016-05-16" and driver_id in (select driver_id from rides where ride_date="2016-05-20")) ;
MS SQL Server 2012 - Insert Values if row does not exist
I'm new to SQL and I need to check whether or not values in a row exist before I insert them. I am attempting to insert details to several rows at once. The code I have is as follows: insert into [Test].[Projects]([TestID], [GroupID], [TestingID], [Grade]) values (314, 9, 77, 2) ,(314, 9, 77, 3) ,(314, 9, 77, 4) ,(329, 2, 65, 2) ,(329, 2, 65, 3) ,(329, 2, 65, 4) go If someone could help me to insert these where the row values do not exist then I would be very grateful
You could use the insert ... select syntax with a not exists condition that ensures that the very same record is not already there in the table: insert into Test.Projects(TestID, GroupID, TestingID, Grade) select v.* from (values (314, 9, 77, 2), (314, 9, 77, 3), (314, 9, 77, 4), (329, 2, 65, 2), (329, 2, 65, 3), (329, 2, 65, 4) ) v(TestID, GroupID, TestingID, Grade) where not exists ( select 1 from Test.Projects p where p.TestID = v.TestID and p.GroupID = v.GroupID and p.TestingID = v.TestingID and p.Grade = v.Grade )
How to fetch the rows with their predefine order in SQL Server?
I have a SQL Server table like this: MenuID MenuName MenuColor --------------------------------------- 10 Daily Tickets Gray 15 Kids Ticket Dark Pink 20 Group Discount Dark Ash 11 Discount ticket Brown 17 Referral Ticket Beige 22 Frequent visitor Musturd 27 Annual Pass sky blue 25 Kids Pass Pink 24 free Ticket Yellow This table has lot of records and more columns too.. Desired result - first four Menus should be ordered with pre-defined order (which I mentioned in my trial query) and remaining should be ordered ASC on MenuName column Desired result set: MenuID MenuName MenuColor --------------------------------------- 10 Daily Tickets Gray 27 Annual Pass sky blue 22 Frequent visitor Musturd 20 Group Discount Dark Ash 11 Discount ticket Brown 24 free Ticket Yellow 25 Kids Pass Pink 15 Kids Ticket Dark Pink 17 Referral Ticket Beige This is the query I tried for this: SELECT * FROM tMenus m ORDER BY (CASE m.MenuName WHEN 'Daily Tickets' THEN 1 WHEN 'Annual Pass' THEN 2 WHEN 'Frequent visitor' THEN 3 WHEN 'Group Discount' THEN 4 END), m.MenuName ASC; However, this is not returning the result that I want. Please correct me where I am wrong. Thanks
Perhaps you just need an else: ORDER BY (CASE m.MenuName WHEN 'Daily Tickets' THEN 1 WHEN 'Annual Pass' THEN 2 WHEN 'Frequent visitor' THEN 3 WHEN 'Group Discount' THEN 4 ELSE 5 END) , m.MenuName ASC;
Adding "DisplayOrder" to the actual table... IF OBJECT_ID('tempdb..#Menue', 'U') IS NOT NULL DROP TABLE #Menue; CREATE TABLE #Menue ( MenuID INT NOT NULL PRIMARY KEY, MenuName VARCHAR(30) NOT NULL, MenuColor VARCHAR(10) NOT NULL, DisplayOrder INT NOT NULL ); INSERT #Menue(MenuID, MenuName, MenuColor, DisplayOrder) VALUES (10,'Daily Tickets', 'Gray', 100), (15,'Kids Ticket', 'Dark Pink', 800), (20,'Group Discount', 'Dark Ash', 400), (11,'Discount ticket', 'Brown', 500), (17,'Referral Ticket', 'Beige', 900), (22,'Frequent visitor', 'Musturd', 300), (27,'Annual Pass', 'sky blue', 200), (25,'Kids Pass', 'Pink', 700), (24,'free Ticket', 'Yellow', 600); -- Note: I'm leaving gaps in the DisplayOrder values. -- This makes it easy to add new values and set their -- values w/o having to adjust existing values. SELECT m.MenuID, m.MenuName, m.MenuColor FROM #Menue m ORDER BY m.DisplayOrder; Edited answer... IF OBJECT_ID('tempdb..#MenueDisplayOrder', 'U') IS NOT NULL DROP TABLE #MenueDisplayOrder; CREATE TABLE #MenueDisplayOrder ( MenueID INT NOT NULL, --add FK to Menues table DisplayTypeID INT NOT NULL, --add FK to available Types table DisplayOrder INT NOT NULL PRIMARY KEY CLUSTERED (DisplayTypeID, MenueID) ); INSERT #MenueDisplayOrder (MenueID, DisplayTypeID, DisplayOrder) VALUES (10, 1, 100), (11, 1, 500), (15, 1, 800), (17, 1, 900), (20, 1, 400), (22, 1, 300), (24, 1, 600), (25, 1, 700), (27, 1, 200), (27, 2, 100), (25, 2, 500), (24, 2, 800), (20, 2, 900), (17, 2, 400), (22, 2, 300), (15, 2, 600), (11, 2, 700), (10, 2, 200), (15, 3, 100), (11, 3, 500), (10, 3, 800), (22, 3, 900), (24, 3, 400), (17, 3, 300), (20, 3, 600), (27, 3, 700), (25, 3, 200); SELECT m.MenuID, m.MenuName, m.MenuColor FROM #Menue m JOIN #MenueDisplayOrder mdo ON m.MenuID = mdo.MenueID WHERE mdo.DisplayTypeID = 2 -- alter this value to change the display order. ORDER BY mdo.DisplayOrder;
SQL MIN() smaller/greater not working properly
I have this Data in DB CREATE TABLE Stu_Table ( Stu_Id VARCHAR(2), Stu_Name VARCHAR(15), Stu_Class VARCHAR(10), sub_id VARCHAR(2), marks VARCHAR(3) ); INSERT INTO Stu_Table VALUES (1, 'Komal', 10, 1, 45); INSERT INTO Stu_Table VALUES (2, 'Ajay', 10, 1, 56); INSERT INTO Stu_Table VALUES (3, 'Rakesh', 10, 1, 67); INSERT INTO Stu_Table VALUES (1, 'Komal', 10, 2, 47); INSERT INTO Stu_Table VALUES (2, 'Ajay', 10, 2, 53); INSERT INTO Stu_Table VALUES (3, 'Rakesh', 10, 2, 57); INSERT INTO Stu_Table VALUES (1, 'Komal', 10, 3, 45); INSERT INTO Stu_Table VALUES (2, 'Ajay', 10, 3, 56); INSERT INTO Stu_Table VALUES (3, 'Rakesh', 10, 3, 67); INSERT INTO Stu_Table VALUES (1, 'Komal', 10, 4, 65); INSERT INTO Stu_Table VALUES (2, 'Ajay', 10, 4, 56); INSERT INTO Stu_Table VALUES (3, 'Rakesh', 10, 4, 37); INSERT INTO Stu_Table VALUES (1, 'Komal', 10, 5, 65); INSERT INTO Stu_Table VALUES (2, 'Ajay', 10, 5, 46); INSERT INTO Stu_Table VALUES (3, 'Rakesh', 10, 5, 63); And I'm doing this query on this data. SELECT * FROM ( SELECT Stu_Id, MIN(marks) AS mini, AVG(marks) AS per FROM stu_table GROUP BY stu_id HAVING MIN(marks) > 45 ); And I'm getting this: Stu_Id| mini | per 1 | 45 | 53.4 2 | 46 | 53.4 3 | 37 | 58.2 I don't understand why I still see Stu_Id 1 with min(mark)=45 when I clearly have this HAVING min(marks)>45 in my query. Runnable Demo FIX: Thanks to #sybkar and #Martin Smith! I set the marks type as a string. It's should be INT... Thanks guys! Working perfect! create table Stu_Table(Stu_Id INT(2), Stu_Name varchar(15), Stu_Class varchar(10),sub_id INT(2),marks INT(3));<--INT!!!
I don't understand why I still see Stu_Id 1 with min(mark)=45 when I clearly have this HAVING min(marks)>45 in my query. You don't. Or at the least the demo you have provided doesn't. In general any weird results that you are getting will be because marks is being stored as a string so MIN(marks) will be bringing back the earliest in alphabetical order though. For example HAVING MIN(marks) > 45 will also bring back 5, 6, 7, 8 and 9