I am using SQLiteStudio and I am trying to run the following query. However, it isn’t returning a value. Can anyone help, please?
SELECT (SELECT COUNT(t_record.LocationID) FROM t_record, t_location WHERE t_record.LocationID = t_location.LocationID AND Y_AXIS >= 0 AND Goal_for = 1) / (SELECT COUNT(GoalID) FROM t_record WHERE t_record.Goal_for) * 100
I have been asked to provide some of the data. Below I have included how I created my 3 tables and then some sample data for each section. Hopefully, this is enough but feel free to ask for more. These are the 3 tables I have created
CREATE TABLE t_location ( LocationID INT PRIMARY KEY, X_Axis INT NOT NULL, Y_AXIS INT NOT NULL ); CREATE TABLE t_method ( MethodID INT PRIMARY KEY, Body_Part VARCHAR(45) NOT NULL ); CREATE TABLE t_record ( GoalID INT PRIMARY KEY, LocationID [INT FORIEIGN KEY] REFERENCES t_location (LocationID), MethodID [INT FORIEIGN KEY] REFERENCES t_method (MethodID), Time INT NOT NULL, Goal_for BOOLEAN NOT NULL
Data for the method table
INSERT INTO t_method VALUES (1,'Left Foot'); INSERT INTO t_method VALUES (2,'Right Foot'); INSERT INTO t_method VALUES (3,'Head');
Data for the location table – only included 3 locations.
INSERT INTO t_location VALUES (1, 0, -1); INSERT INTO t_location VALUES (2, 0, 0); INSERT INTO t_location VALUES (3, 0, 1);
Data for the record table, it is very pland but I’ve varied the location.
INSERT INTO t_record VALUES (1, 1, 1, 28, 1); INSERT INTO t_record VALUES (2, 1, 1, 6, 1); INSERT INTO t_record VALUES (3, 2, 1, 28, 1); INSERT INTO t_record VALUES (4, 2, 1, 28, 1); INSERT INTO t_record VALUES (5, 2, 1, 28, 1); INSERT INTO t_record VALUES (6, 2, 1, 28, 1); INSERT INTO t_record VALUES (7, 3, 1, 28, 1); INSERT INTO t_record VALUES (8, 3, 1, 28, 1); INSERT INTO t_record VALUES (9, 3, 1, 28, 1); INSERT INTO t_record VALUES (10, 3, 1, 28, 1); INSERT INTO t_record VALUES (11, 3, 1, 28, 1); INSERT INTO t_record VALUES (12, 3, 1, 28, 1); INSERT INTO t_record VALUES (1, 3, 1, 28, 1);
Thanks
Advertisement
Answer
Actually you had just a few syntax errors and correcting them plus adding something like * 1.0 to count() would do what you want (otherwise count() results are integer and in SQL server integer / integer would yield an integer which is 0 in your case).
This is your code, slightly modified to work:
SELECT (SELECT COUNT(t_record.LocationID) FROM t_record, t_location WHERE t_record.LocationID = t_location.LocationID AND Y_AXIS >= 0 AND Goal_for = 1) * 1.0 / (SELECT COUNT(GoalID) FROM t_record WHERE t_record.Goal_for=1) * 100;
(I agree with preventing old style joins etc but was not the problem here). You could make it a little better:
SELECT (SELECT COUNT(t_record.LocationID) FROM t_record, t_location WHERE t_record.LocationID = t_location.LocationID AND Y_AXIS >= 0 AND Goal_for = 1) * 100.0 / (SELECT COUNT(GoalID) FROM t_record WHERE t_record.Goal_for=1) as Pct;
While the above code works, I think there is a better and cleaner way:
SELECT SUM(case when Y_AXIS >= 0 then 1 end) * 100.0 / COUNT(*) FROM t_record inner join t_location ON t_record.LocationID = t_location.LocationID where Goal_for = 1;
You can also check what is really going on there with adding those fields:
SELECT SUM(case when Y_AXIS >= 0 then 1 end) as YAXIS_GTE_ZERO, COUNT(*) as Total, SUM(case when Y_AXIS >= 0 then 1 end) * 100.0 / COUNT(*) as Pct FROM t_record inner join t_location ON t_record.LocationID = t_location.LocationID where Goal_for = 1;
And here is DBFiddle demo using your example data
EDIT: And this is for YAXIS >= 0 and YAXIS < 0 as in your comment:
SELECT SUM(CASE WHEN Y_AXIS>=0 THEN 1 END) AS Opp_half_goals , SUM(CASE WHEN Y_AXIS<0 THEN 1 END) AS Own_half_goals , COUNT(*) AS Total , SUM(CASE WHEN Y_AXIS>=0 THEN 1 END)* 100.0 / COUNT(*) AS Opp_half_Pct , SUM(CASE WHEN Y_AXIS<0 THEN 1 END) * 100.0 / COUNT(*) AS Own_half_Pct FROM t_record INNER JOIN t_location ON t_record.LocationID=t_location.LocationID WHERE Goal_for=1;