2008-09-18 4 views
0

J'essaye d'exécuter ce SQL using get external.nommer les colonnes dans Excel avec complexe sql

Cela fonctionne, mais lorsque j'essaie de renommer les sous-requêtes ou quoi que ce soit d'autre, il le supprime.

J'ai essayé as, as et le nom dans '', as alors le nom "", et même avec l'espace. Quelle est la bonne façon de faire cela?

SQL pertinente:

SELECT list_name, app_name, 
    (SELECT fname + ' ' + lname 
    FROM dbo.d_agent_define map 
    WHERE map.agent_id = tac.agent_id) as agent_login, 
    input, CONVERT(varchar,DATEADD(ss,TAC_BEG_tstamp,'01/01/1970')) 
FROM dbo.maps_report_list list 
JOIN dbo.report_tac_agent tac ON (tac.list_id = list.list_id) 
WHERE input = 'SYS_ERR' 
    AND app_name = 'CHARLOTT' 
    AND convert(VARCHAR,DATEADD(ss,day_tstamp,'01/01/1970'),101) = '09/10/2008' 
    AND list_name LIKE 'NRBAD%' 
ORDER BY agent_login,CONVERT(VARCHAR,DATEADD(ss,TAC_BEG_tstamp,'01/01/1970')) 
+0

B.A. Hammer, quelle est la raison pour laquelle vous utilisez la sous-requête, êtes-vous sûr que c'est vraiment nécessaire? – Brettski

Répondre

1

Vous pourriez vous débarrasser de votre sous-requête dbo.d_agent_define et il suffit d'ajouter une table définir se joindre à l'agent.

Ce code fonctionnerait-il?

select list_name, app_name, 
map.fname + ' ' + map.lname as agent_login, 
input, 
convert(varchar,dateadd(ss,TAC_BEG_tstamp,'01/01/1970')) as tac_seconds 
from dbo.maps_report_list list 
join dbo.report_tac_agent tac 
on (tac.list_id = list.list_id) 
join dbo.d_agent_define map 
on (map.agent_id = tac.agent_id) 
where input = 'SYS_ERR' 
and app_name = 'CHARLOTT' 
and convert(varchar,dateadd(ss,day_tstamp,'01/01/1970'),101) = '09/10/2008' 
and list_name LIKE 'NRBAD%' 
order by agent_login,convert(varchar,dateadd(ss,TAC_BEG_tstamp,'01/01/1970')) 

Notez que j'ai appelé votre colonne dateadd car elle n'avait pas de nom. J'ai également essayé de garder votre convention de la façon dont vous faites une jointure. Il y a quelques choses que je ferais différemment avec cette requête pour la rendre plus lisible, mais je me suis concentrée uniquement sur la suppression du problème de sous-requête.

Je ne l'ai pas fait, mais je vous recommande de qualifier toutes vos colonnes avec la table à partir de laquelle vous les obtenez.

0

Pour supprimer la sous requête dans l'instruction SELECT, je suggère ce qui suit:

SELECT list_name, app_name, map.fname + ' ' + map.lname as agent_login, input, convert(varchar,dateadd(ss, TAC_BEG_tstamp, '01/01/1970)) 
FROM dbo.maps_report_list inner join 
    (dbo.report_tac_agent as tac inner join dbo.d_agent_define as map ON (tac.agent_id=map.agent_id)) ON list.list_id = tac.list_id 
WHERE input = 'SYS_ERR' and app_name = 'CHARLOTT' and convert(varchar,dateadd(ss,day_tstamp,'01/01/1970'),101) = '09/10/2008' 
    and list_name LIKE 'NRBAD%' order by agent_login,convert(varchar,dateadd(ss,TAC_BEG_tstamp,'01/01/1970')) 

J'utilisé entre parenthèses pour créer la jointure entre dbo.report_tac_agent et dbo.d_agent_define premier. C'est maintenant un ensemble de données de jointure. La combinaison de ces tables est ensuite jointe à votre table de liste, que je suppose être la table de pilotage ici. Si je comprends ce que vous essayez de faire avec votre sous sélection, cela devrait fonctionner pour vous.

Comme indiqué par l'autre affiche, vous devez utiliser des noms de table sur vos colonnes (par exemple map.fname), cela rend les choses faciles à comprendre. Je n'ai pas dans mon exemple parce que je suis sûr à 100% de savoir quelles colonnes vont avec quelles tables. S'il vous plaît laissez-moi savoir si cela ne le fait pas pour vous et comment les données qu'il renvoie est fausse. Cela rendra plus facile à résoudre en besoin.

Questions connexes