Consulta Maestro detalle

14/01/2008 - 21:34 por ryuyi | Informe spam
Tengo un problema tengo los siguientes datos como por ejemplo
Tabla Encabezado
Factura Nombre Telefono
100 Jose Flores 3245455
Tabla Detalle
Factura Var1 Total1 Var2 Total2 Var3 Total3
100 I 10 X 12 Z 16

Si hago una relacion de datos seria asi
SELECT e.Factura,Nombre,Telefono,
Var1,Total1,Var2,Total2,Var3,Total3
FROM encabezado e, detalle d
WHERE e.Factura=d.Factura

AL hacer esto me mostraria de la siguiente forma

Factura Nombre Telefono Var1 Total1 Var2 Total2 Var3
Total3
100 Jose Flores 3245455 I 10 X 12
Z 16

Pero me gustaria que me muestre de la siguiente manera, alguna idea de como
hacer una consulta que me muestre de la siguiente forma. gracias

Factura Nombre Telefono Varx Totalx
100 Jose Flores 3245455 I 10
X 12
Z 16

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
15/01/2008 - 02:37 | Informe spam
ryuyi,

Debes normalizar la tabla de detalle.

declare @Encabezado TABLE (
Factura VARCHAR(15) NOT NULL,
Nombre VARCHAR(50),
Telefono CHAR(7)
)

DECLARE @Detalle TABLE (
Factura VARCHAR(15) NOT NULL,
Var1 CHAR(1),
Total1 INT,
Var2 CHAR(1),
Total2 INT,
Var3 CHAR(1),
Total3 INT
)

INSERT INTO @Encabezado VALUES(100, 'Jose Flores', '3245455')
INSERT INTO @Detalle VALUES(100, 'I', 10, 'X', 12, 'Z', 16)

SELECT
e.Factura,
e.Nombre,
e.Telefono,
t2.Varx,
t2.Totalx
FROM
@Encabezado AS e
INNER JOIN
(
SELECT
d.Factura,
CASE t1.c1
WHEN 1 THEN Var1
WHEN 2 THEN Var2
WHEN 3 THEN Var3
END AS Varx,
CASE t1.c1
WHEN 1 THEN Total1
WHEN 2 THEN Total2
WHEN 3 THEN Total3
END AS Totalx
FROM
@Detalle AS d
CROSS JOIN
(
SELECT 1 AS c1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
) AS t1
) AS t2
ON e.Factura = t2.Factura

;WITH unpvt_var
AS
(
SELECT
Factura,
Varx,
CASE [Var]
WHEN 'Var1' THEN 1
WHEN 'Var2' THEN 2
WHEN 'Var3' THEN 3
END AS position
FROM
@Detalle
UNPIVOT
(
[Varx]
FOR [Var] IN (Var1, Var2, Var3)
) AS unpvt
),
unpvt_total
AS
(
SELECT
Factura,
Totalx,
CASE [Total]
WHEN 'Total1' THEN 1
WHEN 'Total2' THEN 2
WHEN 'Total3' THEN 3
END AS position
FROM
@Detalle
UNPIVOT
(
[Totalx]
FOR [Total] IN (Total1, Total2, Total3)
) AS unpvt
)
SELECT
e.Factura,
e.Nombre,
e.Telefono,
t1.Varx,
t2.Totalx
FROM
@Encabezado AS e
INNER JOIN
unpvt_var AS t1
ON e.Factura = t1.Factura
INNER JOIN
unpvt_total AS t2
ON t2.Factura = t1.Factura
AND t2.position = t1.position
GO


AMB


"ryuyi" wrote:

Tengo un problema tengo los siguientes datos como por ejemplo
Tabla Encabezado
Factura Nombre Telefono
100 Jose Flores 3245455
Tabla Detalle
Factura Var1 Total1 Var2 Total2 Var3 Total3
100 I 10 X 12 Z 16

Si hago una relacion de datos seria asi
SELECT e.Factura,Nombre,Telefono,
Var1,Total1,Var2,Total2,Var3,Total3
FROM encabezado e, detalle d
WHERE e.Factura=d.Factura

AL hacer esto me mostraria de la siguiente forma

Factura Nombre Telefono Var1 Total1 Var2 Total2 Var3
Total3
100 Jose Flores 3245455 I 10 X 12
Z 16

Pero me gustaria que me muestre de la siguiente manera, alguna idea de como
hacer una consulta que me muestre de la siguiente forma. gracias

Factura Nombre Telefono Varx Totalx
100 Jose Flores 3245455 I 10
X 12
Z 16
Respuesta Responder a este mensaje
#2 ryuyi
15/01/2008 - 21:37 | Informe spam
Alejandro primeramente darte las gracias el ejemplo que me diste es muy
bueno, pero que tendria que modificar en tu consulta para que el resultado me
muestre de la siguiente forma te copio el codigo.

DATOS DE EJEMPLO
> Tabla Encabezado
> Factura Nombre Telefono
> 100 Jose Flores 3245455
> Tabla Detalle
> Factura Nombre guia origen Var1 Total1 Var2 Total2 Var3 Total3
> 100 Jose Flores 2200021 CBB I 10 X 12 Z 16


<< 100 Jose Flores 3352445 SRZ E 30 O
12 P 22
Esas eran las tablas
SELECT
e.Factura,
e.Nombre,
t2.guia,
t2.origen,
t2.Varx, --Variable donde almaceno el valor de x
t2.Totalx,--Variable donde almaceno el valor de mx

FROM
encabezado AS e
INNER JOIN
(
SELECT
d.Factura,d.guia,d.origen
CASE t1.c1
WHEN 1 THEN x1
WHEN 2 THEN x2
WHEN 3 THEN x3
END AS Varx,
CASE t1.c1
WHEN 1 THEN mx1
WHEN 2 THEN mx2
WHEN 3 THEN mx3
END AS Totalx
FROM
detalle AS d
CROSS JOIN
(
SELECT 1 AS c1
UNION ALL
SELECT 2
UNION ALL
SELECT 3

) AS t1 -
) AS t2
ON e.Factura = t2.Factura

Al hacer la consulta obtengo esto

Factura Nombre guia origen varx Totalx
100 Jose Flores 2200021 CBB I 10
100 Jose Flores 2200021 CBB X 12
100 Jose Flores 2200021 CBB Z 16
100 Jose Flores 3352445 SRZ E 30
100 Jose Flores 3352445 SRZ O 12
100 Jose Flores 3352445 SRZ P 22


y Me gustaria que me muestre la consulta de la siguiente forma

Factura Nombre guia origen varx Totalx
100 Jose Flores 2200021 CBB I 10
100 - - X 12
100 - - Z 16
100 3352445 SRZ E 30
100 - - O 12
100 - - P 22

Gracias.





"Alejandro Mesa" wrote:

ryuyi,

Debes normalizar la tabla de detalle.

declare @Encabezado TABLE (
Factura VARCHAR(15) NOT NULL,
Nombre VARCHAR(50),
Telefono CHAR(7)
)

DECLARE @Detalle TABLE (
Factura VARCHAR(15) NOT NULL,
Var1 CHAR(1),
Total1 INT,
Var2 CHAR(1),
Total2 INT,
Var3 CHAR(1),
Total3 INT
)

INSERT INTO @Encabezado VALUES(100, 'Jose Flores', '3245455')
INSERT INTO @Detalle VALUES(100, 'I', 10, 'X', 12, 'Z', 16)

SELECT
e.Factura,
e.Nombre,
e.Telefono,
t2.Varx,
t2.Totalx
FROM
@Encabezado AS e
INNER JOIN
(
SELECT
d.Factura,
CASE t1.c1
WHEN 1 THEN Var1
WHEN 2 THEN Var2
WHEN 3 THEN Var3
END AS Varx,
CASE t1.c1
WHEN 1 THEN Total1
WHEN 2 THEN Total2
WHEN 3 THEN Total3
END AS Totalx
FROM
@Detalle AS d
CROSS JOIN
(
SELECT 1 AS c1
UNION ALL
SELECT 2
UNION ALL
SELECT 3
) AS t1
) AS t2
ON e.Factura = t2.Factura

;WITH unpvt_var
AS
(
SELECT
Factura,
Varx,
CASE [Var]
WHEN 'Var1' THEN 1
WHEN 'Var2' THEN 2
WHEN 'Var3' THEN 3
END AS position
FROM
@Detalle
UNPIVOT
(
[Varx]
FOR [Var] IN (Var1, Var2, Var3)
) AS unpvt
),
unpvt_total
AS
(
SELECT
Factura,
Totalx,
CASE [Total]
WHEN 'Total1' THEN 1
WHEN 'Total2' THEN 2
WHEN 'Total3' THEN 3
END AS position
FROM
@Detalle
UNPIVOT
(
[Totalx]
FOR [Total] IN (Total1, Total2, Total3)
) AS unpvt
)
SELECT
e.Factura,
e.Nombre,
e.Telefono,
t1.Varx,
t2.Totalx
FROM
@Encabezado AS e
INNER JOIN
unpvt_var AS t1
ON e.Factura = t1.Factura
INNER JOIN
unpvt_total AS t2
ON t2.Factura = t1.Factura
AND t2.position = t1.position
GO


AMB


"ryuyi" wrote:

> Tengo un problema tengo los siguientes datos como por ejemplo
> Tabla Encabezado
> Factura Nombre Telefono
> 100 Jose Flores 3245455
> Tabla Detalle
> Factura Var1 Total1 Var2 Total2 Var3 Total3
> 100 I 10 X 12 Z 16
>
> Si hago una relacion de datos seria asi
> SELECT e.Factura,Nombre,Telefono,
> Var1,Total1,Var2,Total2,Var3,Total3
> FROM encabezado e, detalle d
> WHERE e.Factura=d.Factura
>
> AL hacer esto me mostraria de la siguiente forma
>
> Factura Nombre Telefono Var1 Total1 Var2 Total2 Var3
> Total3
> 100 Jose Flores 3245455 I 10 X 12
> Z 16
>
> Pero me gustaria que me muestre de la siguiente manera, alguna idea de como
> hacer una consulta que me muestre de la siguiente forma. gracias
>
> Factura Nombre Telefono Varx Totalx
> 100 Jose Flores 3245455 I 10
> X 12
> Z 16
Respuesta Responder a este mensaje
#3 Alejandro Mesa
16/01/2008 - 22:44 | Informe spam
ryuyi,

Te recomiendo que eso lo hagas en la aplicacion cliente o herramienta de
reportes que uses. Por ejemplo, si usas Reporting Services, tienes una
propiedad llamada "Hide duplicates" para mostrar solo la primera instancia de
un valor en un text box. Usa el motor SQL para seleccionar data, no para
formatearla.

AMB

"ryuyi" wrote:

Alejandro primeramente darte las gracias el ejemplo que me diste es muy
bueno, pero que tendria que modificar en tu consulta para que el resultado me
muestre de la siguiente forma te copio el codigo.

DATOS DE EJEMPLO
> > Tabla Encabezado
> > Factura Nombre Telefono
> > 100 Jose Flores 3245455
> > Tabla Detalle
> > Factura Nombre guia origen Var1 Total1 Var2 Total2 Var3 Total3
> > 100 Jose Flores 2200021 CBB I 10 X 12 Z 16
<< 100 Jose Flores 3352445 SRZ E 30 O
12 P 22
Esas eran las tablas
SELECT
e.Factura,
e.Nombre,
t2.guia,
t2.origen,
t2.Varx, --Variable donde almaceno el valor de x
t2.Totalx,--Variable donde almaceno el valor de mx

FROM
encabezado AS e
INNER JOIN
(
SELECT
d.Factura,d.guia,d.origen
CASE t1.c1
WHEN 1 THEN x1
WHEN 2 THEN x2
WHEN 3 THEN x3
END AS Varx,
CASE t1.c1
WHEN 1 THEN mx1
WHEN 2 THEN mx2
WHEN 3 THEN mx3
END AS Totalx
FROM
detalle AS d
CROSS JOIN
(
SELECT 1 AS c1
UNION ALL
SELECT 2
UNION ALL
SELECT 3

) AS t1 -
) AS t2
ON e.Factura = t2.Factura

Al hacer la consulta obtengo esto

Factura Nombre guia origen varx Totalx
100 Jose Flores 2200021 CBB I 10
100 Jose Flores 2200021 CBB X 12
100 Jose Flores 2200021 CBB Z 16
100 Jose Flores 3352445 SRZ E 30
100 Jose Flores 3352445 SRZ O 12
100 Jose Flores 3352445 SRZ P 22


y Me gustaria que me muestre la consulta de la siguiente forma

Factura Nombre guia origen varx Totalx
100 Jose Flores 2200021 CBB I 10
100 - - X 12
100 - - Z 16
100 3352445 SRZ E 30
100 - - O 12
100 - - P 22

Gracias.





"Alejandro Mesa" wrote:

> ryuyi,
>
> Debes normalizar la tabla de detalle.
>
> declare @Encabezado TABLE (
> Factura VARCHAR(15) NOT NULL,
> Nombre VARCHAR(50),
> Telefono CHAR(7)
> )
>
> DECLARE @Detalle TABLE (
> Factura VARCHAR(15) NOT NULL,
> Var1 CHAR(1),
> Total1 INT,
> Var2 CHAR(1),
> Total2 INT,
> Var3 CHAR(1),
> Total3 INT
> )
>
> INSERT INTO @Encabezado VALUES(100, 'Jose Flores', '3245455')
> INSERT INTO @Detalle VALUES(100, 'I', 10, 'X', 12, 'Z', 16)
>
> SELECT
> e.Factura,
> e.Nombre,
> e.Telefono,
> t2.Varx,
> t2.Totalx
> FROM
> @Encabezado AS e
> INNER JOIN
> (
> SELECT
> d.Factura,
> CASE t1.c1
> WHEN 1 THEN Var1
> WHEN 2 THEN Var2
> WHEN 3 THEN Var3
> END AS Varx,
> CASE t1.c1
> WHEN 1 THEN Total1
> WHEN 2 THEN Total2
> WHEN 3 THEN Total3
> END AS Totalx
> FROM
> @Detalle AS d
> CROSS JOIN
> (
> SELECT 1 AS c1
> UNION ALL
> SELECT 2
> UNION ALL
> SELECT 3
> ) AS t1
> ) AS t2
> ON e.Factura = t2.Factura
>
> ;WITH unpvt_var
> AS
> (
> SELECT
> Factura,
> Varx,
> CASE [Var]
> WHEN 'Var1' THEN 1
> WHEN 'Var2' THEN 2
> WHEN 'Var3' THEN 3
> END AS position
> FROM
> @Detalle
> UNPIVOT
> (
> [Varx]
> FOR [Var] IN (Var1, Var2, Var3)
> ) AS unpvt
> ),
> unpvt_total
> AS
> (
> SELECT
> Factura,
> Totalx,
> CASE [Total]
> WHEN 'Total1' THEN 1
> WHEN 'Total2' THEN 2
> WHEN 'Total3' THEN 3
> END AS position
> FROM
> @Detalle
> UNPIVOT
> (
> [Totalx]
> FOR [Total] IN (Total1, Total2, Total3)
> ) AS unpvt
> )
> SELECT
> e.Factura,
> e.Nombre,
> e.Telefono,
> t1.Varx,
> t2.Totalx
> FROM
> @Encabezado AS e
> INNER JOIN
> unpvt_var AS t1
> ON e.Factura = t1.Factura
> INNER JOIN
> unpvt_total AS t2
> ON t2.Factura = t1.Factura
> AND t2.position = t1.position
> GO
>
>
> AMB
>
>
> "ryuyi" wrote:
>
> > Tengo un problema tengo los siguientes datos como por ejemplo
> > Tabla Encabezado
> > Factura Nombre Telefono
> > 100 Jose Flores 3245455
> > Tabla Detalle
> > Factura Var1 Total1 Var2 Total2 Var3 Total3
> > 100 I 10 X 12 Z 16
> >
> > Si hago una relacion de datos seria asi
> > SELECT e.Factura,Nombre,Telefono,
> > Var1,Total1,Var2,Total2,Var3,Total3
> > FROM encabezado e, detalle d
> > WHERE e.Factura=d.Factura
> >
> > AL hacer esto me mostraria de la siguiente forma
> >
> > Factura Nombre Telefono Var1 Total1 Var2 Total2 Var3
> > Total3
> > 100 Jose Flores 3245455 I 10 X 12
> > Z 16
> >
> > Pero me gustaria que me muestre de la siguiente manera, alguna idea de como
> > hacer una consulta que me muestre de la siguiente forma. gracias
> >
> > Factura Nombre Telefono Varx Totalx
> > 100 Jose Flores 3245455 I 10
> > X 12
> > Z 16
Respuesta Responder a este mensaje
#4 ryuyi
16/01/2008 - 23:59 | Informe spam
Alejandro:

Gracias por tu colaboracion, ya resolvi el problema añadiendo algunas
restriciones a la consulta para que me muestre de esa forma que queria
gracias.

"Alejandro Mesa" wrote:

ryuyi,

Te recomiendo que eso lo hagas en la aplicacion cliente o herramienta de
reportes que uses. Por ejemplo, si usas Reporting Services, tienes una
propiedad llamada "Hide duplicates" para mostrar solo la primera instancia de
un valor en un text box. Usa el motor SQL para seleccionar data, no para
formatearla.

AMB

"ryuyi" wrote:

> Alejandro primeramente darte las gracias el ejemplo que me diste es muy
> bueno, pero que tendria que modificar en tu consulta para que el resultado me
> muestre de la siguiente forma te copio el codigo.
>
> DATOS DE EJEMPLO
> > > Tabla Encabezado
> > > Factura Nombre Telefono
> > > 100 Jose Flores 3245455
> > > Tabla Detalle
> > > Factura Nombre guia origen Var1 Total1 Var2 Total2 Var3 Total3
> > > 100 Jose Flores 2200021 CBB I 10 X 12 Z 16
> << 100 Jose Flores 3352445 SRZ E 30 O
> 12 P 22
> Esas eran las tablas
> SELECT
> e.Factura,
> e.Nombre,
> t2.guia,
> t2.origen,
> t2.Varx, --Variable donde almaceno el valor de x
> t2.Totalx,--Variable donde almaceno el valor de mx
>
> FROM
> encabezado AS e
> INNER JOIN
> (
> SELECT
> d.Factura,d.guia,d.origen
> CASE t1.c1
> WHEN 1 THEN x1
> WHEN 2 THEN x2
> WHEN 3 THEN x3
> END AS Varx,
> CASE t1.c1
> WHEN 1 THEN mx1
> WHEN 2 THEN mx2
> WHEN 3 THEN mx3
> END AS Totalx
> FROM
> detalle AS d
> CROSS JOIN
> (
> SELECT 1 AS c1
> UNION ALL
> SELECT 2
> UNION ALL
> SELECT 3
>
> ) AS t1 -
> ) AS t2
> ON e.Factura = t2.Factura
>
> Al hacer la consulta obtengo esto
>
> Factura Nombre guia origen varx Totalx
> 100 Jose Flores 2200021 CBB I 10
> 100 Jose Flores 2200021 CBB X 12
> 100 Jose Flores 2200021 CBB Z 16
> 100 Jose Flores 3352445 SRZ E 30
> 100 Jose Flores 3352445 SRZ O 12
> 100 Jose Flores 3352445 SRZ P 22
>
>
> y Me gustaria que me muestre la consulta de la siguiente forma
>
> Factura Nombre guia origen varx Totalx
> 100 Jose Flores 2200021 CBB I 10
> 100 - - X 12
> 100 - - Z 16
> 100 3352445 SRZ E 30
> 100 - - O 12
> 100 - - P 22
>
> Gracias.
>
>
>
>
>
> "Alejandro Mesa" wrote:
>
> > ryuyi,
> >
> > Debes normalizar la tabla de detalle.
> >
> > declare @Encabezado TABLE (
> > Factura VARCHAR(15) NOT NULL,
> > Nombre VARCHAR(50),
> > Telefono CHAR(7)
> > )
> >
> > DECLARE @Detalle TABLE (
> > Factura VARCHAR(15) NOT NULL,
> > Var1 CHAR(1),
> > Total1 INT,
> > Var2 CHAR(1),
> > Total2 INT,
> > Var3 CHAR(1),
> > Total3 INT
> > )
> >
> > INSERT INTO @Encabezado VALUES(100, 'Jose Flores', '3245455')
> > INSERT INTO @Detalle VALUES(100, 'I', 10, 'X', 12, 'Z', 16)
> >
> > SELECT
> > e.Factura,
> > e.Nombre,
> > e.Telefono,
> > t2.Varx,
> > t2.Totalx
> > FROM
> > @Encabezado AS e
> > INNER JOIN
> > (
> > SELECT
> > d.Factura,
> > CASE t1.c1
> > WHEN 1 THEN Var1
> > WHEN 2 THEN Var2
> > WHEN 3 THEN Var3
> > END AS Varx,
> > CASE t1.c1
> > WHEN 1 THEN Total1
> > WHEN 2 THEN Total2
> > WHEN 3 THEN Total3
> > END AS Totalx
> > FROM
> > @Detalle AS d
> > CROSS JOIN
> > (
> > SELECT 1 AS c1
> > UNION ALL
> > SELECT 2
> > UNION ALL
> > SELECT 3
> > ) AS t1
> > ) AS t2
> > ON e.Factura = t2.Factura
> >
> > ;WITH unpvt_var
> > AS
> > (
> > SELECT
> > Factura,
> > Varx,
> > CASE [Var]
> > WHEN 'Var1' THEN 1
> > WHEN 'Var2' THEN 2
> > WHEN 'Var3' THEN 3
> > END AS position
> > FROM
> > @Detalle
> > UNPIVOT
> > (
> > [Varx]
> > FOR [Var] IN (Var1, Var2, Var3)
> > ) AS unpvt
> > ),
> > unpvt_total
> > AS
> > (
> > SELECT
> > Factura,
> > Totalx,
> > CASE [Total]
> > WHEN 'Total1' THEN 1
> > WHEN 'Total2' THEN 2
> > WHEN 'Total3' THEN 3
> > END AS position
> > FROM
> > @Detalle
> > UNPIVOT
> > (
> > [Totalx]
> > FOR [Total] IN (Total1, Total2, Total3)
> > ) AS unpvt
> > )
> > SELECT
> > e.Factura,
> > e.Nombre,
> > e.Telefono,
> > t1.Varx,
> > t2.Totalx
> > FROM
> > @Encabezado AS e
> > INNER JOIN
> > unpvt_var AS t1
> > ON e.Factura = t1.Factura
> > INNER JOIN
> > unpvt_total AS t2
> > ON t2.Factura = t1.Factura
> > AND t2.position = t1.position
> > GO
> >
> >
> > AMB
> >
> >
> > "ryuyi" wrote:
> >
> > > Tengo un problema tengo los siguientes datos como por ejemplo
> > > Tabla Encabezado
> > > Factura Nombre Telefono
> > > 100 Jose Flores 3245455
> > > Tabla Detalle
> > > Factura Var1 Total1 Var2 Total2 Var3 Total3
> > > 100 I 10 X 12 Z 16
> > >
> > > Si hago una relacion de datos seria asi
> > > SELECT e.Factura,Nombre,Telefono,
> > > Var1,Total1,Var2,Total2,Var3,Total3
> > > FROM encabezado e, detalle d
> > > WHERE e.Factura=d.Factura
> > >
> > > AL hacer esto me mostraria de la siguiente forma
> > >
> > > Factura Nombre Telefono Var1 Total1 Var2 Total2 Var3
> > > Total3
> > > 100 Jose Flores 3245455 I 10 X 12
> > > Z 16
> > >
> > > Pero me gustaria que me muestre de la siguiente manera, alguna idea de como
> > > hacer una consulta que me muestre de la siguiente forma. gracias
> > >
> > > Factura Nombre Telefono Varx Totalx
> > > 100 Jose Flores 3245455 I 10
> > > X 12
> > > Z 16
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida