lunes, 31 de agosto de 2020

WebSocket Client con C#

 

La tecnología de websocket se ha hecho muy popular y es que realmente nos permite hacer algunas cosas muy fáciles como la posibilidad de habilitar una conexión desde nuestra aplicación web para poder transportar datos.  

En este caso vamos a ver como crear un cliente WebSocket con C#

Vamos a crear una aplicación de console. Mi proyecto tiene el nombre de WebSocketClient. Con el proyecto listo ya podemos iniciar a escribir nuestro código para conexión.

Lo primero que debemos hacer es importar algunas librerías para poder crear la conexión.


using System;
using System.IO;
using System.Net.WebSockets;
using System.Text;
using System.Threading;

Vamos a usar el servicio gratuito de WebSocket que tenemos en esta página http://www.websocket.org/echo.html

Como se puede observar lo primero que vamos a declarar es la variable url que contiene la dirección del WebSocket

   public class Program
    {
        private const string url = "ws://echo.websocket.org";

        public static async System.Threading.Tasks.Task Main(string[] args)
        {
            //Iniciamos un cliente websocket para conectarnos con el servidor
            using (var websocket = new ClientWebSocket())
            {
                //Asignamos el url del servidor de websocket y nos conectamos
                await websocket.ConnectAsync(new Uri(url), CancellationToken.None);

                Console.WriteLine("Message to the server");
                var info = Console.ReadLine();//Mensaje que se quiere enviar al servidor
                //Enviamos el mensaje que capturamos desde la consola
                await websocket.SendAsync(Encoding.UTF8.GetBytes(info), WebSocketMessageType.Text, true, CancellationToken.None);

                //Creamos un arreglo de bytes para recibir la información del servidor
                var buffer = new ArraySegment<byte>(new byte[2048]);
                WebSocketReceiveResult serverResponse;
                using (var ms = new MemoryStream())//Vamos almacenar todos los fragmentos de datos en este objeto en memoria.
                {
                    do
                    {
                        //Vamos a recibir datos pequeños hasta que recibamos todo el mensaje. 
                        serverResponse = await websocket.ReceiveAsync(buffer, CancellationToken.None);
                        ms.Write(buffer.Array, buffer.Offset, serverResponse.Count);
                    } while (!serverResponse.EndOfMessage);

                    if (serverResponse.MessageType == WebSocketMessageType.Close)
                        Environment.Exit(0);//Si el socket se cierra salimos de la aplicación 

                    ms.Seek(0, SeekOrigin.Begin);
                    using (var reader = new StreamReader(ms, Encoding.UTF8))
                        Console.WriteLine(await reader.ReadToEndAsync());
                }

            }
        }
    }

Con un bloque using creamos un objeto de tipo ClientWebSocket que nos permitirá la conexión con el servidor. Para poder iniciar la conexión se tiene que pasar la dirección del servidor al método connectAsync.

La variable info nos permite almacenar cualquier dato que el usuario quiera pasarle al servidor. Luego se pasa al método sendAsync para ser enviado.

En el caso de recibir datos es un poco más complicado. Para esto vamos a recibir tamaños pequeños de información. Almacenándolos en un arreglo de bytes como podemos ver en la variable buffer. Si lo que el servidor nos envía es mayor se va a ir almacenando en la variable ms. En memoria hasta tener toda la información completa. Por eso utilizamos un ciclo.

Cuando tenemos toda la información en la variable ms se debe convertir a un StreamReader que luego la pasaremos en un texto. Esto es lo que al final estamos esperando, como resultado se muestra lo leído en la consola de nuestra app.

Ejemplo


Etiquetas: , , , , ,

lunes, 24 de agosto de 2020

Visual Studio Code y Python

 

Python es un lenguaje de programación muy popular hoy en día y la verdad es que podemos programar casi que, en cualquier IDE o editor de texto, pero porque no hacerlo fácil y de una manera que nos beneficie. Bueno usando Visual Studio Code que también hoy en día es una herramienta muy popular lo podemos lograr ya que además cuanta con librerías que nos ayudan a la hora de programar Python.

Primero debemos instalar Python. Si no lo tenemos o no sabemos cómo hacerlo podemos ver este post.

Ahora lo que tenemos que hacer es descargar VS Code desde este sitio web

Cuando tenemos estos dos instalados en nuestra maquina tenemos que ir a la barra de herramientas al izquierdo.


Se tiene que buscar Python. Se tiene que instalar la primera que nos sale, la cual es de Microsoft.


Luego buscamos la extensión de anaconda (si queremos usar anaconda)

Y finalmente instalamos Visual Studio Intellicode


Esta ultima nos ayuda con nuestro código de Python. Nos da ayudas y nos permite autocompletar nuestro código.

Ya con todo esto instalado se tiene que seleccionar el intérprete de Python que instalamos


Para seleccionar el interprete se tiene que ir a la línea de comandos que tenemos en la parte superior como se puede observar en la imagen. La podemos abrir dando clic sobre la esquina inferior izquierda en VS Code o con “control shift p” luego se escribe Python interpreter y nos da la opción para selección la ubicación donde esta instalado nuestro interprete de Python.

De esta manera podemos iniciar a escribir código de Python con VSCode

 

Etiquetas: , , , ,

Reporte Técnico Predicción Salarial

 Nuestro trabajo se centra en un dataset con información relacionada a trabajos de Estados Unidos. La idea del dataSet es poder predecir el salario de los trabajos utilizando modelos que nos permitan predecir información.

Los datos fueron encontrados en Kaggle. El cual es un dataset de libre uso para el análisis de datos, en el siguiente link https://www.kaggle.com/andrewmvd/data-analyst-jobs/tasks. El cual cuenta con 2253 filas y 16 columnas. Las propiedades del dataset se definen de la siguiente manera.

1.       Id: esta propiedad es solamente un número que identifica cada una de las filas del dataset

2.       Job Title: este describe el titulo o nombre del empleo

3.       Salary Estimate: esta propiedad tiene un rango de cuanto paga cada uno de los trabajos. Esta información fue encontrada en Glassdoor.

4.       Job Description: tiene información relaciona a que es el trabajo que se va a desempeñar.

5.       Rating: evaluación que le dan los empleados a las empresas

6.       Company name: el nombre la compañía que se está evaluando

7.       Location: donde se encuentra ubicada la empresa

8.       Company Headquartes location: la ubicación de la compañía

9.       Size: la cantidad de empleados con los que cuanta la compañía.

10.   Founded: el año cuando fue fundada la compañía

11.   Type of ownership: el tipo de compañía que se va a analizar

12.   Industry: la industria a la que pertenece la empresa

13.   Sector: el sector en el que esta la industria de la empresa

14.   Revenue: cuanto genera la compañía

15.   Competitors:  cuales con los posibles competidores de la empresa

16.   Easy Apply: Si es fácil aplicar para la empresa o no

Lo primero que se realizó fue cargar el documento en Python para ver su contenido. Se hace un head para ver el contenido rápidamente del dataset. Luego se realiza un análisis de la estructura del dataset, esto para ver que tipos de objetos tiene cada una de las columnas. Después de esto se pasa verificar si existen valores nulos en el dataset.

Para poder hacer algunos análisis se requiere cambiar los valores alfanuméricos a valores numéricos, por lo que se carga otro dataset para poder analizar la información tanto en su estado original como en con sus valores numéricos ya que se van a tener que hacer algunas transformaciones de datos.

Durante el proceso se crean diferentes dataset para analizar diferentes cosas, por ejemplo, se crea un pequeño dataset con el salario, título del trabajo y raiting del empleo. Esto para verificar algunas preguntas que teníamos del set de datos.

Utilizando ordenamiento se busca información relacionada a los mejores salarios comparándolos con las calificaciones de las personas. Con esto podemos encontrar datos interesantes del dataset y determinar que únicamente con estos criterios no podemos predecir correctamente los salarios. Definitivamente se va a requerir más datos.  


Se inicia hacer algunos gráficos para ver los datos. Por ejemplo, la relación que existe entre Salary Estimate y Job Title. Los gráficos inicialmente son un poco difíciles de interpretar ya que tiene muchos datos por lo que se va a crear datasets más pequeños. La idea es poder entender mejor los datos utilizando set de datos que se pueden visualizar en los gráficos.

Se crear más ordenamientos para ir entendiendo los datos de manera simple. Lo primero que se hace es ordenar los datos por medio del rating para verificar si los salarios más altos se encurtan ubicados entre las empresas con mayores calificaciones o si no es así. Esto se logra utilizando la función sort_values de Python que además permite crear ordenamiento por diferentes tipos de valores del set de datos. Se hacen ordenamientos por medio del Salary Estimate para poder ver si las empresas con los salarios más altos cuentan con las mejores calificaciones con esto se puede determinar que las mejores calificaciones no están estrictamente relacionas a los mejores salarios de las personas. Por lo que se debe realizar otra serie de estudios para encontrar mayores relaciones entre los datos con los que contamos.

La idea de hacer conjuntos de datos más pequeños realmente nos ayudo a crear muchas observaciones que se pueden graficar y estudiar de manera detallada. Parte de las observaciones que se hacen están basadas en los supuestos con los que se inicial el proyecto para predicción de salarios.

 

 

Se hacen otros filtros de datos con diferentes valores para ir inspeccionando la información un poco más y de esta manera comprendiendo mucho mejor con que estamos tratando.

Continuando con el proceso de análisis de datos iniciamos a ver la información que contenía cada una de las propiedades de nuestro dataset. Utilizando la función unique de Python buscamos los valores únicos de las diferentes columnas con el fin de poder generar valores únicos para cada una de las variables. Ya que algunos procedimientos y modelos no soportan datos alfanuméricos.

Nos damos cuenta de que los valores de las columnas en algunos casos son muchísimos por lo que transformar esto de manera manual no es simple. Con esto se decide a crear un algoritmo que nos permite transformar los datos de manera automática, pero tenemos que guardar la equivalencia de cada uno de estos datos para futuros estudios.

El algoritmo que creamos realmente es muy simple. Lo que hacemos es buscar el valor único de cada una de las columnas que tenemos en el dataset. Creamos una lista que se encarga de asignar un valor numérico para cada uno de los valores de texto que tiene cada columna. Al final como resultado tenemos una lista que cuenta con un formato llave/valor para representar el valor numérico equivalente al dato que tenia el set de manera original.

El proceso fue encontrar los valores únicos de cada una de las columnas con esto se generaron valores numéricos que representaran cada de los datos. Cada columna del dataset tiene una lista que contiene sus valores números para futuros procesos, esto con el fin de no olvidar que representa cada uno de los nuevos datos del conjunto. Luego de esto se crea un ciclo que se encarga de recorrer la columna e ir cambiando el valor alfanumérico por el valor numérico que representa el dato que tenemos en nuestro dataset.

Este último proceso se corrió para cada una de las columnas que no tenían valores numéricos.

En el caso de la columna Easy Apply esto es un valor true/false lo que representa valores de verdadero o falso. Esta columna no tenia todos los datos completos y con algunos -1 dentro de su información. Todos los valores de true se convirtieron en 1 los otros fueron convertidos a 0. Este fue un poco más simple ya que no teníamos esa cantidad enorme de datos como las otras columnas.

La ultima columnas a la que nos tocaba analizar para ver que podíamos hacer con esta era la columna de job description. Tomamos el tiempo de ver qué tipo de información teníamos en esta columna. Se encuentran los valores únicos de esta columna y prácticamente toda la información que tenia esta columna era de filas únicas. Es decir, cada una de las diferentes descripciones de los trabajos eran únicos. Lo que nos llevo a la tarea de analizar el contenido y fuimos viendo la información que tenía. Esta columna realmente no tenía información cuantificable o medible. Lo que nos daba esta columna eran datos de qué tipo de trabajo se estaba hablando, algunas descripciones de roles y tipos de personas que podrían estar interesadas en el trabajo. Por ejemplo, algunas hablaban de que querían personas que fueran muy trabajadoras, etc. Pero no le estaban aportando un valor real al estudio que se deseaba hacer.

Llegamos a la conclusión que lo mejor seria quitar la columna de nuestro estudio. Ya que no nos estaba dando un valor importante a nuestro análisis.

Para continuar con el proceso se hace una inspección de la estructura de los datos ya con la transformación. Nos damos cuenta de que algunos tipos de datos no son de tipo int. Esto da problemas con algunas tareas de análisis de datos. 


Por lo que nos dimos a la tarea de convertir todos los tipos de datos a int32 que realmente era la forma en la que teníamos almacenados ahora la información. Esto nos permite trabajar con la información que tenemos con todos los modelos y procesos de visualización que queríamos crear.

El resultado de dataset por procesar fue con una estructura de tipos de datos numéricos (int32) que nos permitirá utilizar todos los tipos de gráficos y modelos.


Nos dimos cuenta de que teníamos pendiente una columna más por analizar la cual era founded. Esta columna representa cuando la empresa fue fundada, pero en algunos casos tenia un -1 que representa que no tiene una fecha de su fundación. Por lo que se realizo otra transformación de datos y pasamos este dato a un 0. Ahora el 0 representa que la compañía no tiene fecha de fundación.

A partir de este punto se inicia otra serie de análisis datos para ver cómo podemos entender mejor la información con la que contamos.


Como podemos observa en este grafico se hace un conteo de los tipos de salarios. Que tenemos en los datos. Esto nos demuestra cual es el salario más ofrecido por las diferentes empresas. Podemos visualizar de manera simple como se agrupan los rangos salariales que tenemos. Además de esto se continúa haciendo otros tipos de gráficos con diferente tipo de información para poder entenderla mucho mejor. Algunos gráficos son difíciles de entender ya que la cantidad de información es muy amplia.

Con este problema lo que hacemos es crear subdatasets con filtros que nos permitan ver información de manera más fácil. Por ejemplo, tomamos todos los datos de las empresas con mejores calificaciones y con este extracto de datos creamos gráficos.


Esta técnica sin ninguna duda permite entender mejor la información y crear datos que nos permitan responder a interrogantes específicas. Este proceso lo hicimos varias veces con el fin de entender diferentes partes de la información con la que estamos trabajando. El filtrar la información nos da mayor control sobre lo que deseamos investigar y los resultados que estamos buscando.

De esta forma por ejemplo se pudo encontrar la relación que tenemos de los mayores salarios y las evaluaciones de las personas.

 Ahora es momento de trabajar con los modelos. Para hacer este trabajo se desarrollaron tres modelos diferentes para 3 tipos de datasets.

Los modelos fueron

·         SVR

·         RF

·         LinearRegression

En el caso de los dataset fueron seleccionados de la siguiente forma. Uno que encontramos directamente en la página que proponía cuales eran los valores que se debían seleccionar para crear los modelos, este fue tomado como el modelo de criterio experto. En el caso de los otros dos modelos se generar proceso para hacer un feature selection usando librerías de Python. El primero dataset se utilizo el algoritmo de SelectKBest y luego el ExtraTreeClassifier. Estos dos últimos nos dieron columnas muy similares sin embargo si existían diferencias. Por lo que se toma la decisión de usar ambos para crear modelos y ver cual nos brinda mejores resultados.

El primer modelo que de criterio experto contiene los siguientes atributos

·         Industry

·         Location

·         Compny revenue

El modelo que con el algoritmo kBest

·         Job Title

·         Salary Estimate

·         Company Name

·         Location

·         Headquartes

·         Founded

·         Type of ownership

·         Industry

·         Sector

·         Revenue

·         Competitor

El modelo ExtreTreelassifier

·         Job Title

·         Salary Estimate

·         Compnay name

·         Location

·         Headquarters

·         Size

·         Founded

·         Type of ownersh

·         Industry

·         Sector

·         Revenue

Ya con estos dataset se procede a crear una variable para cada dataset que contenga la variable dependiente que será la que vamos a predecir.

Después de esto se crean los dataset que vamos a usar, pero sin la variable dependiente esto con el fin de crear los sets de entrenamiento y de pruebas. Para cada uno de los dataset se crea una parte de pruebas y una parte de entrenamiento. Se analiza la información que contiene los sets de entrenamiento y pruebas solo para ver que fuero creados correctamente.

Luego debemos importar algunas librerías extras de Python para poder ejecutar algunos modelos que se requieren para poder predecir la información.

Para la creación de los modelos más simple se hacen variables que contiene cada uno de los modelos para cada uno de los datasets.


El siguiente paso que tenemos que hacer es iniciar a construir los modelos.  Utilizando los datos de entrenamiento vamos a crear cada uno de los modelos.

En total vamos a generar 9 modelos que tenemos que analizar para ver cual nos da mejores resultados. Con esto vamos a generar estadísticas que nos permitan entender cual es el modelo que vamos a utilizar basados en las estadísticas que se fueron generando en el proyecto.

Detalle de las estadísticas


En el cuadro anterior podemos observar las estadísticas que hemos generado con los modelos para la predicción de los empleos.

Nos damos cuenta de que el dataset con la menor cantidad de datos no es el que nos genera los mejores resultados. Los dos dataset que usan la selección de atributos utilizando las funciones de Python nos dan mejores resultados a la hora de predecir la información.

Nos damos cuenta de que no siempre el uso del criterio experto nos da los mejores resultados es mejor crear estudios un poco más profundos para poder comprender mejor que atributos son los correctos para mejorar las predicciones.

Código de Python https://github.com/jeanPython/jobbSalary/blob/master/Job%20Salary.ipynb

Regresar

Etiquetas: , , ,

martes, 4 de agosto de 2020

Python para Data Analysis



Después de usar lagunas herramientas para el estudio de datos como RapidMinder y R me parece que Python es mucho más fácil y rápido para el estudio de datos.  Por supuesto R es una gran herramienta que no debemos menospreciar.

Vamos a ver que se necesita para iniciar con el análisis de datos con Python. Podemos hacer dos cosas descargar anaconda que ya tiene varios frameworks para el análisis de datos o podemos instalar Python y luego continuar con la instalación de las otras librerías.

Primero debemos descargar Python https://www.python.org/downloads/ tiene que buscar la versión que aplica para su sistema operativo. En mi caso estoy usando Windows. Tenemos que agregar una variable en el Home para Python. Después de esto podemos correr Python en el cmd


Esto nos mostrara la versión de Python que tenemos instalado y nos permite asegurarnos que los instalamos correctamente.

Ahora debemos verificar que versión de pip tenemos. En el cmd debemos digitar “pip –version”


Pip en Windows se debió haber instalado cuando se instalo Python, pero se podría actualizar si fuera necesario.

Ahora tenemos que instalar algunas librerías que son necesarias para nuestro análisis de datos.

1.       Numpy

2.       Pandas

3.       Matplotlib

4.       Scipy

5.       Scikit-learn

Estas librerías las vamos a instalar usando PIP con el siguiente comando desde cmd.

“pip install panda”

Ahora solamente se debe cambiar el nombre de la librería que se desea instalar. Cuando terminamos con las librerías vamos a usar el comando “pip freeze” con el fin de ver si tenemos todas las librerías necesarias instaladas.

A continuación, vamos a instalar Jupyter Note para poder ejecutar nuestras operaciones de Python. Se puede usar con otros IDEs pero realmente Jupyter es muy fácil y tiene muy buenas características para hacer nuestro trabajo limpio y rápido.

Igual que las otras librerías tenemos que correr pip install jupyter. Cuando lo tenemos instalados vamos a correr en el cmd “jupyter notebook” esto nos abre nuestro editor de texto para Python.

De esta forma podemos ver nuestro código de Python


Ya estamos listos para trabajar con nuestros proyectos de datos

Regresar


Etiquetas: , , , ,

lunes, 3 de agosto de 2020

Crear Json desde SQLServer queries


El uso de Json se ha hecho muy popular y común para transmitir datos por medio de la web y diferentes sistemas internos y externos de diferentes empresas. Ahora a partir de SQLServer 2016 podemos crear queries que pueden generar resultados con Json.

Con el uso de Json se puede manipular el tipo de resultado que vamos a crear. Vamos a ver unos ejemplos de como se puede logar esto.

Primero vamos a crear una tabla para poder crear los queries.

Las tablas y los datos los encontramos en este link https://www.progress.com/tutorials/ado-net/code-examples-sql-server

Con el siguiente ejemplo podemos ver como generar el resultado de Json. Usando “FOR JSON PATH” y también podemos controlar el formato.

SELECT * FROM emp FOR JSON PATH

[{"empno":1,"ename":"JOHNSON","job":"ADMIN","mgr":6,"hiredate":"1990-12-17T00:00:00","sal":18000.00,"dept":4},{"empno":2,"ename":"HARDING","job":"MANAGER","mgr":9,"hiredate":"1998-02-02T00:00:00","sal":52000.00,"comm":300.00,"dept":3},{"empno":3,"ename":"TAFT","job":"SALES I","mgr":2,"hiredate":"1996-01-02T00:00:00","sal":25000.00,"comm":500.00,"dept":3},{"empno":4,"ename":"HOOVER","job":"SALES I","mgr":2,"hiredate":"1990-04-02T00:00:00","sal":27000.00,"dept":3},{"empno":5,"ename":"LINCOLN","job":"TECH","mgr":6,"hiredate":"1994-06-23T00:00:00","sal":22500.00,"comm":1400.00,"dept":4},{"empno":6,"ename":"GARFIELD","job":"MANAGER","mgr":9,"hiredate":"1993-05-01T00:00:00","sal":54000.00,"dept":4},{"empno":7,"ename":"POLK","job":"TECH","mgr":6,"hiredate":"1997-09-22T00:00:00","sal":25000.00,"dept":4},{"empno":8,"ename":"GRANT","job":"ENGINEER","mgr":10,"hiredate":"1997-03-30T00:00:00","sal":32000.00,"dept":2},{"empno":9,"ename":"JACKSON","job":"CEO","hiredate":"1990-01-01T00:00:00","sal":75000.00,"dept":4},{"empno":10,"ename":"FILLMORE","job":"MANAGER","mgr":9,"hiredate":"1994-08-09T00:00:00","sal":56000.00,"dept":2},{"empno":11,"ename":"ADAMS","job":"ENGINEER","mgr":10,"hiredate":"1996-03-15T00:00:00","sal":34000.00,"dept":2},{"empno":12,"ename":"WASHINGTON","job":"ADMIN","mgr":6,"hiredate":"1998-04-16T00:00:00","sal":18000.00,"dept":4},{"empno":13,"ename":"MONROE","job":"ENGINEER","mgr":10,"hiredate":"2000-12-03T00:00:00","sal":30000.00,"dept":2},{"empno":14,"ename":"ROOSEVELT","job":"CPA","mgr":9,"hiredate":"1995-10-12T00:00:00","sal":35000.00,"dept":1}]

Con el atributo de ROOT se puede crear un nodo principal para agregar todo el resto del JSON

SELECT empno,ename,job,mgr,hiredate,sal,comm,dept FROM emp

FOR JSON PATH, ROOT('emp')

{"emp":[{"empno":1,"ename":"JOHNSON","job":"ADMIN","mgr":6,"hiredate":"1990-12-17T00:00:00","sal":18000.00,"dept":4},{"empno":2,"ename":"HARDING","job":"MANAGER","mgr":9,"hiredate":"1998-02-02T00:00:00","sal":52000.00,"comm":300.00,"dept":3},{"empno":3,"ename":"TAFT","job":"SALES I","mgr":2,"hiredate":"1996-01-02T00:00:00","sal":25000.00,"comm":500.00,"dept":3},{"empno":4,"ename":"HOOVER","job":"SALES I","mgr":2,"hiredate":"1990-04-02T00:00:00","sal":27000.00,"dept":3},{"empno":5,"ename":"LINCOLN","job":"TECH","mgr":6,"hiredate":"1994-06-23T00:00:00","sal":22500.00,"comm":1400.00,"dept":4},{"empno":6,"ename":"GARFIELD","job":"MANAGER","mgr":9,"hiredate":"1993-05-01T00:00:00","sal":54000.00,"dept":4},{"empno":7,"ename":"POLK","job":"TECH","mgr":6,"hiredate":"1997-09-22T00:00:00","sal":25000.00,"dept":4},{"empno":8,"ename":"GRANT","job":"ENGINEER","mgr":10,"hiredate":"1997-03-30T00:00:00","sal":32000.00,"dept":2},{"empno":9,"ename":"JACKSON","job":"CEO","hiredate":"1990-01-01T00:00:00","sal":75000.00,"dept":4},{"empno":10,"ename":"FILLMORE","job":"MANAGER","mgr":9,"hiredate":"1994-08-09T00:00:00","sal":56000.00,"dept":2},{"empno":11,"ename":"ADAMS","job":"ENGINEER","mgr":10,"hiredate":"1996-03-15T00:00:00","sal":34000.00,"dept":2},{"empno":12,"ename":"WASHINGTON","job":"ADMIN","mgr":6,"hiredate":"1998-04-16T00:00:00","sal":18000.00,"dept":4},{"empno":13,"ename":"MONROE","job":"ENGINEER","mgr":10,"hiredate":"2000-12-03T00:00:00","sal":30000.00,"dept":2},{"empno":14,"ename":"ROOSEVELT","job":"CPA","mgr":9,"hiredate":"1995-10-12T00:00:00","sal":35000.00,"dept":1}]}

Podemos agrupar o crear Json dentro del Json principal como podemos ver en el siguiente ejemplo.

SELECT empno [emp.empno],ename [emp.ename],job,mgr,hiredate,sal,comm,dept FROM emp

FOR JSON PATH, ROOT('emp')

{"emp":[{"emp":{"empno":1,"ename":"JOHNSON"},"job":"ADMIN","mgr":6,"hiredate":"1990-12-17T00:00:00","sal":18000.00,"dept":4},{"emp":{"empno":2,"ename":"HARDING"},"job":"MANAGER","mgr":9,"hiredate":"1998-02-02T00:00:00","sal":52000.00,"comm":300.00,"dept":3},{"emp":{"empno":3,"ename":"TAFT"},"job":"SALES I","mgr":2,"hiredate":"1996-01-02T00:00:00","sal":25000.00,"comm":500.00,"dept":3},{"emp":{"empno":4,"ename":"HOOVER"},"job":"SALES I","mgr":2,"hiredate":"1990-04-02T00:00:00","sal":27000.00,"dept":3},{"emp":{"empno":5,"ename":"LINCOLN"},"job":"TECH","mgr":6,"hiredate":"1994-06-23T00:00:00","sal":22500.00,"comm":1400.00,"dept":4},{"emp":{"empno":6,"ename":"GARFIELD"},"job":"MANAGER","mgr":9,"hiredate":"1993-05-01T00:00:00","sal":54000.00,"dept":4},{"emp":{"empno":7,"ename":"POLK"},"job":"TECH","mgr":6,"hiredate":"1997-09-22T00:00:00","sal":25000.00,"dept":4},{"emp":{"empno":8,"ename":"GRANT"},"job":"ENGINEER","mgr":10,"hiredate":"1997-03-30T00:00:00","sal":32000.00,"dept":2},{"emp":{"empno":9,"ename":"JACKSON"},"job":"CEO","hiredate":"1990-01-01T00:00:00","sal":75000.00,"dept":4},{"emp":{"empno":10,"ename":"FILLMORE"},"job":"MANAGER","mgr":9,"hiredate":"1994-08-09T00:00:00","sal":56000.00,"dept":2},{"emp":{"empno":11,"ename":"ADAMS"},"job":"ENGINEER","mgr":10,"hiredate":"1996-03-15T00:00:00","sal":34000.00,"dept":2},{"emp":{"empno":12,"ename":"WASHINGTON"},"job":"ADMIN","mgr":6,"hiredate":"1998-04-16T00:00:00","sal":18000.00,"dept":4},{"emp":{"empno":13,"ename":"MONROE"},"job":"ENGINEER","mgr":10,"hiredate":"2000-12-03T00:00:00","sal":30000.00,"dept":2},{"emp":{"empno":14,"ename":"ROOSEVELT"},"job":"CPA","mgr":9,"hiredate":"1995-10-12T00:00:00","sal":35000.00,"dept":1}]}

De esta manera podemos generar documentos o resultados de Json con nuestros datos de SQLServer

Etiquetas: , ,