Reputation: 1204
Im trying to format all my DATA in my sql before display information
Both my joins work fine, I have a piece of data (status) that has associated titles to go with the value but the CASE
statment isn't working. I currently have a PHP swtich statement that does this data conversion but I'd like to do it in SQL if possible
SELECT
l.leadid, l.companyname, l.status, l.dateadded, addedby.name AS addedby, assignedto.name AS assignedto, l.address, l.city, l.prov, l.country, l.postalcode,
l.phone, l.fax, l.facebook, l.twitter, l.youtube, l.instagram, l.website, l.logo
FROM leads l
INNER JOIN staff addedby ON l.addedby = addedby.staffid
INNER JOIN staff assignedto ON l.assignedto = assignedto.staffid
CASE l.status
WHEN l.status = 7 THEN l.status = 'Converted'
WHEN l.status = 6 THEN l.status = 'Hot'
WHEN l.status = 5 THEN l.status = 'Warm'
WHEN l.status = 4 THEN l.status = 'Open'
WHEN l.status = 3 THEN l.status = 'NEW'
WHEN l.status = 2 THEN l.status = 'Cold'
ELSE l.status = 'Dead'
END
WHERE l.leadid = $id
Upvotes: 1
Views: 101
Reputation: 92795
CASE
in SELECT
clauseCASE
syntax is invalidmysql
) specific less verbose function ELT()
That being said you can do either
SELECT
l.leadid, l.companyname,
CASE l.status
WHEN 7 THEN 'Converted'
WHEN 6 THEN 'Hot'
WHEN 5 THEN 'Warm'
WHEN 4 THEN 'Open'
WHEN 3 THEN 'NEW'
WHEN 2 THEN 'Cold'
ELSE 'Dead'
END status,
l.dateadded, addedby.name AS addedby,
assignedto.name AS assignedto, l.address,
l.city, l.prov, l.country, l.postalcode,
l.phone, l.fax, l.facebook, l.twitter,
l.youtube, l.instagram, l.website, l.logo
FROM leads l JOIN staff addedby
ON l.addedby = addedby.staffid JOIN staff assignedto
ON l.assignedto = assignedto.staffid
WHERE l.leadid = $id
or
SELECT
l.leadid, l.companyname,
IFNULL(ELT(l.status - 1, 'Cold', 'New', 'Open', 'Warm', 'Hot', 'Converted'), 'Dead') status,
l.dateadded, addedby.name AS addedby,
assignedto.name AS assignedto, l.address,
l.city, l.prov, l.country, l.postalcode,
l.phone, l.fax, l.facebook, l.twitter,
l.youtube, l.instagram, l.website, l.logo
FROM leads l JOIN staff addedby
ON l.addedby = addedby.staffid JOIN staff assignedto
ON l.assignedto = assignedto.staffid
WHERE l.leadid = $id
Here is SQLFiddle demo (for both cases)
Upvotes: 3
Reputation: 5258
The case should be in the SELECT
list, not after the INNER JOIN
.
Also second issue is the use of l.status = after each THEN statement. MySql syntax only requires the final value after the THEN statement, not a value assignment.
Also note that you don't need the l.status =
part in your when
statements, because the case value
is listed next to the CASE
statement. If you were building an ad hoc case statement, then it would be needed. So, you can just write it as follows:
I would just write it as follows:
SELECT
l.leadid,
l.companyname,
CASE l.status
WHEN 7 THEN 'Converted'
WHEN 6 THEN 'Hot'
WHEN 5 THEN 'Warm'
WHEN 4 THEN 'Open'
WHEN 3 THEN 'NEW'
WHEN 2 THEN 'Cold'
ELSE 'Dead'
END As Status,
l.dateadded,
< rest of your fields >
FROM leads l
INNER JOIN staff addedby ON l.addedby = addedby.staffid
INNER JOIN staff assignedto ON l.assignedto = assignedto.staffid
WHERE l.leadid = $id
Upvotes: 2
Reputation: 2358
Try It
SELECT
l.leadid, l.companyname, l.status, l.dateadded, addedby.name AS addedby, assignedto.name AS assignedto, l.address, l.city, l.prov, l.country, l.postalcode,
l.phone, l.fax, l.facebook, l.twitter, l.youtube, l.instagram, l.website, l.logo, CASE l.status
WHEN l.status = 7 THEN l.status = 'Converted'
WHEN l.status = 6 THEN l.status = 'Hot'
WHEN l.status = 5 THEN l.status = 'Warm'
WHEN l.status = 4 THEN l.status = 'Open'
WHEN l.status = 3 THEN l.status = 'NEW'
WHEN l.status = 2 THEN l.status = 'Cold'
ELSE l.status = 'Dead'
END
FROM leads l
INNER JOIN staff addedby ON l.addedby = addedby.staffid
INNER JOIN staff assignedto ON l.assignedto = assignedto.staffid
WHERE l.leadid = $id
Upvotes: -2