2011-02-10 71 views
5

tengo una instrucción de selección de SQL como esto:Cómo agregar encabezados de columna de la tabla a SQL instrucción de selección

select FirstName, LastName, Age from People 

Esto me va a devolver algo así como una tabla:

Peter Smith 34 
John Walker 46 
Pat Benetar 57 

Lo que yo quiero es insertar los títulos de las columnas en la primera fila como:

First Name Last Name Age 
=========== ========== ==== 
Peter  Smith  34 
John  Walker  46 
Pat   Benetar 57 

puede alguien sugerir cómo esto podría lograrse?

¿Podría crear una tabla temporal con los títulos y anexar los datos a esto?

+1

Si desea agregar un encabezado a TODAS las columnas incluidas NON-VARCHAR, tiene muchos problemas con este enfoque (si insiste en la capa de la base de datos) – RichardTheKiwi

Respuesta

7

Ninguna de las respuestas anteriores funcionará, a menos que todos sus nombres aparezcan después de "primero" en orden de clasificación.

Select FirstName, LastName 
from (
    select Sorter = 1, FirstName, LastName from People 
    union all 
    select 0, 'FirstName', 'LastName') X 
order by Sorter, FirstName -- or whatever ordering you need 

Si quieres hacer esto para todas las columnas no varchar así, los inconvenientes son (al menos):

  1. TODOS sus datos pasarán a formar VARCHAR. Si usa Visual Studio, por ejemplo, ya no podrá reconocer ni usar valores de fecha. O int valores. O cualquier otro para ese asunto.
  2. Debe proporcionar explícitamente un formato de valores de fecha y hora como fecha de nacimiento. Los valores DOB en Varchar en el formato dd-mm-aaaa (si eso es lo que usted elige para convertirlos) no se ordenarán correctamente.

El SQL para lograr esto, sin embargo no se recomienda-, es

Select FirstName, LastName, Age, DOB 
from (
    select Sorter = 1, 
     Convert(Varchar(max), FirstName) as FirstName, 
     Convert(Varchar(max), LastName) as LastName, 
     Convert(Varchar(max), Age)  as Age, 
     Convert(Varchar(max), DOB, 126) as DOB 
    from People 
    union all 
    select 0, 'FirstName', 'LastName', 'Age', 'DOB') X 
order by Sorter, FirstName -- or whatever ordering you need 
+0

@cyberwiki: sí, he fallado con' UNION ALL '. Por alguna razón, pensé que solo toma valores únicos de diferentes conjuntos. Gracias. – zerkms

+0

+1 @cyberkiwi: buen punto para mencionar un posible problema cuando se trata de ordenar –

1

La forma más ligera de hacerlo es probable que hacer una UNION:

SELECT 'FirstName' AS FirstName, 'LastName' AS LastName 
UNION ALL 
SELECT FirstName, LastName 
FROM People 

No hay necesidad de crear tablas temporales.

+1

No podrá decir si 'Nombre' es un nombre, ya que está ordenado en cualquier parte de los datos. – RichardTheKiwi

+0

@cyberkiwi: no hay 'orden por' - entonces 'UNION ALL' solo agregará el segundo conjunto de resultados al primero. – zerkms

+0

Hola, buena respuesta. Sin embargo, hice mi ejemplo de pregunta demasiado simplificado. Resulta que una de las columnas no es del tipo de cadena, es decir. Edad para que parezcan chocar cuando se unen. ¿Hay una forma de evitar eso? Has modificado la pregunta ahora. –

0

El UNION All es la solución a excepción cabe señalar que:

  1. Para añadir una cabecera a una columna que no sea char requerirá convertir la columna en la primera parte de la consulta.
  2. Si la columna convertida se utiliza como parte de la orden de clasificación entonces la referencia de campo tendrá que ser al nombre de la columna en la consulta, no la tabla

ejemplo:

Select Convert(varchar(25), b.integerfiled) AS [Converted Field]... 
... Order by [Converted Field] 
Cuestiones relacionadas