Click here to monitor SSC
SQLServerCentral is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
 
 
 
        
Home       Members    Calendar    Who's On


Add to briefcase

A case statement in the from clause? Expand / Collapse
Author
Message
Posted Wednesday, January 23, 2013 8:30 AM
Forum Newbie

Forum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum NewbieForum Newbie

Group: General Forum Members
Last Login: Wednesday, February 13, 2013 12:40 PM
Points: 1, Visits: 75
I need some help with a query that involves changing the joins when a field is a certain value. The problem I am trying to solve is in the second part of the union. If the deliverymethod is ‘Virtual’ then I need to return the shipping address if the address description is like ‘shipping’ else return the primary address. The joins change to the address table for these two conditions. The contact table is related to the address table in a one-to-one relationship based on addressid in each table (the primary address). However the address table can have multiple addresses (shipping, billing, etc.) for a contact joined on the contact table contactid to the address table entityid. Can someone tell me how to change this query? Any help is appreciated.

SELECT C.FIRSTNAME,C.LASTNAME,A.ADDRESS1,A.ADDRESS2,A.CITY,A.STATE,A.POSTALCODE,A.COUNTRY,
C.WORKPHONE,C.EMAIL,EH.ENROLLSTATUS
FROM SYSDBA.EVXENROLLHX EH
INNER JOIN SYSDBA.EVXEVENT E ON EH.EVXEVENTID = E.EVXEVENTID
INNER JOIN SYSDBA.EVXEVTICKET ET ON EH.EVXEVTICKETID = ET.EVXEVTICKETID
INNER JOIN SYSDBA.CONTACT C ON ET.ATTENDEECONTACTID = C.CONTACTID
INNER JOIN SYSDBA.ADDRESS A ON C.ADDRESSID = A.ADDRESSID
WHERE E.DELIVERYMETHOD != 'Virtual'
and EH.EVXEVENTID = '?'
UNION
SELECT C.FIRSTNAME,C.LASTNAME,A.ADDRESS1,A.ADDRESS2,A.CITY,A.STATE,A.POSTALCODE,A.COUNTRY,
C.WORKPHONE,C.EMAIL,EH.ENROLLSTATUS
FROM SYSDBA.EVXENROLLHX EH
INNER JOIN SYSDBA.EVXEVENT E ON EH.EVXEVENTID = E.EVXEVENTID
INNER JOIN SYSDBA.EVXEVTICKET ET ON EH.EVXEVTICKETID = ET.EVXEVTICKETID
INNER JOIN SYSDBA.CONTACT C ON ET.ATTENDEECONTACTID = C.CONTACTID
CASE
WHEN DESCRIPTION LIKE 'Shipping%' THEN INNER JOIN SYSDBA.ADDRESS A ON C.CONTACTID = A.ENTITYID
ELSE INNER JOIN SYSDBA.ADDRESS A ON C.ADDRESSID = A.ADDRESSID
END
WHERE E.DELIVERYMETHOD = 'Virtual'
and EH.EVXEVENTID = '?'
Post #1410618
Posted Wednesday, January 23, 2013 9:24 AM


Hall of Fame

Hall of FameHall of FameHall of FameHall of FameHall of FameHall of FameHall of FameHall of FameHall of Fame

Group: General Forum Members
Last Login: Today @ 8:16 AM
Points: 3,226, Visits: 64,165
Pirate92 (1/23/2013)

SELECT C.FIRSTNAME,C.LASTNAME,A.ADDRESS1,A.ADDRESS2,A.CITY,A.STATE,A.POSTALCODE,A.COUNTRY,
C.WORKPHONE,C.EMAIL,EH.ENROLLSTATUS
FROM SYSDBA.EVXENROLLHX EH
INNER JOIN SYSDBA.EVXEVENT E ON EH.EVXEVENTID = E.EVXEVENTID
INNER JOIN SYSDBA.EVXEVTICKET ET ON EH.EVXEVTICKETID = ET.EVXEVTICKETID
INNER JOIN SYSDBA.CONTACT C ON ET.ATTENDEECONTACTID = C.CONTACTID
CASE
WHEN DESCRIPTION LIKE 'Shipping%' THEN INNER JOIN SYSDBA.ADDRESS A ON C.CONTACTID = A.ENTITYID
ELSE INNER JOIN SYSDBA.ADDRESS A ON C.ADDRESSID = A.ADDRESSID
END
WHERE E.DELIVERYMETHOD = 'Virtual'
and EH.EVXEVENTID = '?'


Just join both tables and use the case in the select, like this.
SELECT
C.FIRSTNAME,C.LASTNAME,
ADDRESS1 = CASE WHEN A.DESCRIPTION LIKE 'Shipping%' THEN A1.ADDRESS1 ELSE A2.ADDRESS1 END,
ADDRESS2 = CASE WHEN A.DESCRIPTION LIKE 'Shipping%' THEN A1.ADDRESS2 ELSE A2.ADDRESS2 END,
CITY = CASE WHEN A.DESCRIPTION LIKE 'Shipping%' THEN A1.CITY ELSE A2.CITY END,
STATE = CASE WHEN A.DESCRIPTION LIKE 'Shipping%' THEN A1.STATE ELSE A2.STATE END,
POSTALCODE = CASE WHEN A.DESCRIPTION LIKE 'Shipping%' THEN A1.POSTALCODE ELSE A2.POSTALCODE END,
COUNTRY = CASE WHEN A.DESCRIPTION LIKE 'Shipping%' THEN A1.COUNTRY ELSE A2.COUNTRY END,
C.WORKPHONE,C.EMAIL,EH.ENROLLSTATUS
FROM SYSDBA.EVXENROLLHX EH
INNER JOIN SYSDBA.EVXEVENT E ON EH.EVXEVENTID = E.EVXEVENTID
INNER JOIN SYSDBA.EVXEVTICKET ET ON EH.EVXEVTICKETID = ET.EVXEVTICKETID
INNER JOIN SYSDBA.CONTACT C ON ET.ATTENDEECONTACTID = C.CONTACTID
LEFT JOIN SYSDBA.ADDRESS A1 ON C.CONTACTID = A1.ENTITYID
LEFT JOIN SYSDBA.ADDRESS A2 ON C.ADDRESSID = A2.ADDRESSID
CASE
WHEN DESCRIPTION LIKE 'Shipping%' THEN INNER JOIN SYSDBA.ADDRESS A ON C.CONTACTID = A.ENTITYID
ELSE INNER JOIN SYSDBA.ADDRESS A ON C.ADDRESSID = A.ADDRESSID
END
WHERE E.DELIVERYMETHOD = 'Virtual'
and EH.EVXEVENTID = '?'





--Mark Tassin
MCITP - SQL Server DBA
Proud member of the Anti-RBAR alliance.
For help with Performance click this link
For tips on how to post your problems
Post #1410675
« Prev Topic | Next Topic »

Add to briefcase

Permissions Expand / Collapse