Possible Duplicate:
Count the Null columns in a row in SQL
I've had a dig around for answers to this, but can't find either a working or suitable answer and I'm a novice with SQL.
I've got a table containing teams for an event, and amongst other columns I have team_member_1
, team_member_2
, team_member_3
, team_member_4
, team_member_5
. Each one stores the name of that team memember, each team has a different amount of members (between 3 and 5).
I'm trying count the number of people in a team by counting how many columns/ fields within that row/team are NOT NULL
.
If my head if would go something like:
Select Count NOT NULL team_member_1, team_member_2, team_member_3,
team_member_4, team_member_5
from Teams
where team_id = 5
Of course this doesn't work. I then want to times this figure by £20 (as the event cost is £20 per head), to give me the amount each team owes, and that will be echo'd out on the website. Hope all makes sense.
Imho, that's a really bad design :)
First of all, I would normalize the db. If that is done, your question about the number of team members is a simple
SELECT COUNT(*) ...
Make a table for the teams, one for the member and a third where you "concat" the team member with a team.
As others have pointed out, this is a bad design and you should try to normalize. However, I'd try something like this:
You should at least normalize to the first normal form by creating a Team table and a Member table and reference Member to Team.
The key to solve your problem is to use specific if function
For Oracle it could be DECODE.
For MySQL it could be IF.
I you are using the SQL Server, you should use CASE statement
You should have a relation table TeamMember -> Team with relation of 1:n \ n:n.
Then in your query join the two tables,Group by the team and count the team members.
If your server product supports the boolean data type and implicitly converts it to integer when in a proper context, like MySQL does, for instance, then you could try the following pattern: