2011-01-05 2 views
1

Je ne suis pas sûr de la syntaxe de ce que j'essaie de faire. J'ai besoin de sélectionner plusieurs champs d'adresse en fonction des conditions.Besoin d'aide avec une instruction de cas complexe SQL 2005

La logique est solide mais il semble que la syntaxe soit incorrecte. Il me donne des erreurs avec 'Syntaxe incorrecte près du mot clé' Case ',' Else ',' Else '. L'idée est d'insérer l'adresse dans la table si isprimary = 1, s'il n'y a pas d'insert primaire l'adresse la plus récente qui est active = 1, s'il n'y a pas d'actif alors insérez l'adresse la plus récente.

S'il vous plaît Aide


- Sélectionnez une meilleure adresse pour enregistrement 02

DECLARE @ygcaddress TABLE 
(
[AccountID] varchar(10), 
[Address1] varchar(25), 
[City] varchar(22), 
[State] varchar(3), 
[Zip] varchar(9) 
) 
INSERT INTO @ygcaddress 
CASE 
WHEN Address.IsPrimary=1 
THEN 
SELECT 
LEFT(Address.AddressLine1,25), 
Address.City, 
[Lookup].LookupValue, 
Address.Zip 
FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) 
INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) 
INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) 
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
WHERE Address.IsPrimary=1 
ELSE 
CASE 
WHEN Address.IsActive=1 
THEN 
SELECT TOP 1 
LEFT(Address.AddressLine1,25), 
Address.City, 
[Lookup].LookupValue, 
Address.Zip 
FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) 
INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) 
INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) 
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
WHERE Address.IsActive=1 
ELSE 
SELECT TOP 1 
LEFT(Address.AddressLine1,25), 
Address.City, 
[Lookup].LookupValue, 
Address.Zip 
FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) 
INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) 
INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) 
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
END 
END 
+0

Pourriez-vous simplifier la requête sans perdre l'essence de votre question? –

Répondre

0

parenthèses Ajouté au cas des résultats, cela devrait fonctionner (syntaxiquement au moins).

--Select One best address for Record 02 
DECLARE @ygcaddress TABLE ([AccountID] varchar(10), [Address1] varchar(25), [City] varchar(22), [State] varchar(3), [Zip] varchar(9)) 
INSERT INTO @ygcaddress 
SELECT 
CASE WHEN Address.IsPrimary=1 THEN 
    (
     SELECT LEFT(Address.AddressLine1,25), Address.City, [Lookup].LookupValue, Address.Zip 
     FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID WHERE Address.IsPrimary=1 
    ) 
ELSE 
    CASE WHEN Address.IsActive=1 THEN 
     (SELECT TOP 1 LEFT(Address.AddressLine1,25), Address.City, [Lookup].LookupValue, Address.Zip FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID WHERE Address.IsActive=1) 
    ELSE 
     (SELECT TOP 1 LEFT(Address.AddressLine1,25), Address.City, [Lookup].LookupValue, Address.Zip FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID) 
    END 
END 
0

Essayez ceci, de ce que je peux voir qu'il ressemble à une erreur de syntaxe dans votre question initiale:

DECLARE @ygcaddress TABLE 
(
    [AccountID] varchar(10), 
    [Address1] varchar(25), 
    [City] varchar(22), 
    [State] varchar(3), 
    [Zip] varchar(9) 
) 

INSERT INTO @ygcaddress 
    CASE 

     WHEN Address.IsPrimary=1 
     THEN 
     SELECT 
     LEFT(Address.AddressLine1,25), 
     Address.City, 
     [Lookup].LookupValue, 
     Address.Zip 
     FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) 
      INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) 
      INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) 
      INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
      WHERE Address.IsPrimary=1 

     WHEN Address.IsActive=1 
     THEN 
     SELECT TOP 1 
     LEFT(Address.AddressLine1,25), 
     Address.City, 
     [Lookup].LookupValue, 
     Address.Zip 
     FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) 
      INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) 
      INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) 
      INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
      WHERE Address.IsActive=1 

     ELSE 
     SELECT TOP 1 
     LEFT(Address.AddressLine1,25), 
     Address.City, 
     [Lookup].LookupValue, 
     Address.Zip 
     FROM (((AccountPerson INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID) 
      INNER JOIN Address ON AccountPerson.PersonID=Address.PersonID) 
      INNER JOIN @ygcaddress y ON Account.AccountID=y.AccountID) 
      INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID 
    END 
0

Sans creuser dans ce trop, vous semblez manquer le mot-clé « VALEURS » tout au moins. La syntaxe de squelette pour une instruction INSERT est

 
INSERT INTO table_name (column1, column2, column3,...) 
VALUES (value1, value2, value3,...) 

Je vous suggère d'écrire une déclaration correcte INSERT avec des chaînes littérales (ou autre) avant d'essayer de remplacer quoi que ce soit plus complexe.

0

Si j'ai bien compris le problème, je ne pense pas que vous vouliez une instruction CASE du tout: une instruction CASE renvoie une expression de valeur, pas un tuple comme vous essayez de le faire. (Au moins dans SQL Server qui est la base de données SQL que je suis le plus familier)

EDITED pour supprimer ma première solution suggérée en utilisant UNION, que j'ai réalisé était incorrect.

à nouveau sous la direction:

Essayez quelque chose comme ceci:

INSERT INTO @ygcaddress 
SELECT 
    Account.AccountID 
    ,LEFT(Address.AddressLine1,25) 
    ,Address.City 
    ,[Lookup].LookupValue 
    ,Address.Zip 
FROM AccountPerson 
INNER JOIN Account ON AccountPerson.AccountID=Account.AccountID 
INNER JOIN 
(
    SELECT TOP 1 
    A1.* 
    CASE 
     WHEN A1.IsPrimary=1 THEN 10 
     WHEN A1.IsPrimary=0 AND A1.IsActive=1 THEN 5 
     ELSE 1 
    END [Rank] 
    FROM Address A1 
    ORDER BY [Rank] DESC 
) Address ON AccountPerson.PersonID=Address.PersonID 
INNER JOIN [Lookup] ON Address.StateID=[Lookup].LookupID