Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   No puedo hacer UNION (https://www.clubdelphi.com/foros/showthread.php?t=39583)

Carmelo Cash 24-01-2007 17:15:51

No puedo hacer UNION
 
Hola Foro:
Quisiera saber si me pueden ayudar a hacer esto con InterBase 1.0.0.326.
Tengo la siguiente consulta que muestra el total de ventas de cada terminal para un día específico (solo las terminales 4 ,5 Y 8).


Select
T.BRANCH_CODE as Terminal,
M.Description as Descripcion,
sum(T.TOTAL_AMOUNT) as Total

From V_TRANSACTIONS T
Join V_Master M on (M.BRANCH_CODE=T.BRANCH_CODE)

Where Extract (Day From T.TRANSACTION_DATE) = 31 /*<--- COLOCAR EL DIA */
and Extract (Month From T.TRANSACTION_DATE) = 05 /*<--- COLOCAR EL MES */
and Extract (Year From T.TRANSACTION_DATE) = 2005 /*<--- COLOCAR EL AÑO */
and T.BRANCH_CODE in (4,5,8) /*<----- Colocar las Terminales que se incluyen) */

Group by T.BRANCH_CODE,M.Description

El Resultado obtenido es:
TERMINAL--DESCRIPCION--TOTAL
--------4--Don Pepito---------50
--------5--Don José-----------60
--------8--Mi Abuela---------120


Tengo esta otra (que es casi igual) pero muestra la suma de todas las terminales

Select

Count(Distinct(T.BRANCH_CODE)) As Terminal,
'TOTAL' As Descripcion ,
Sum(T.TOTAL_AMOUNT) As Total

From V_TRANSACTIONS T

Where Extract (Day From T.TRANSACTION_DATE) = 31 /*<--- COLOCAR EL DIA */
and Extract (Month From T.TRANSACTION_DATE) = 05 /*<--- COLOCAR EL MES */
and Extract (Year From T.TRANSACTION_DATE) = 2005 /*<--- COLOCAR EL AÑO */
and T.BRANCH_CODE in (4,5,8) /*<----- Colocar las Terminales que se incluyen) */

El Resultado obtenido es:
TERMINAL--DESCRIPCION--TOTAL
--------3--Total---------------230


Mi intención es lograr el siguiente resultado:

TERMINAL--DESCRIPCION--TOTAL
--------4--Don Pepito---------50
--------5--Don José-----------60
--------8--Mi Abuela---------120
--------3--Total---------------230


Estoy probando colocar UNION entre las dos consultas pero aparece el siguiente error:

Dynamic SQL Error
SQL error code = -104
Invalid command
Data type unknown
:confused:

estoy escribiendo así:


Select
T.BRANCH_CODE as Terminal,
M.Description as Descripcion,
sum(T.TOTAL_AMOUNT) as Total

From V_TRANSACTIONS T
Join V_Master M on (M.BRANCH_CODE=T.BRANCH_CODE)

Where Extract (Day From T.TRANSACTION_DATE) = 31 /*<--- COLOCAR EL DIA */
and Extract (Month From T.TRANSACTION_DATE) = 05 /*<--- COLOCAR EL MES */
and Extract (Year From T.TRANSACTION_DATE) = 2005 /*<--- COLOCAR EL AÑO */
and T.BRANCH_CODE in (4,5,8) /*<----- Colocar las Terminales que se incluyen) */

Group by T.BRANCH_CODE,M.Description

UNION

Select

Count(Distinct(T.BRANCH_CODE)) As Terminal,
'TOTAL' As Descripcion ,
Sum(T.TOTAL_AMOUNT) As Total

From V_TRANSACTIONS T

Where Extract (Day From T.TRANSACTION_DATE) = 31 /*<--- COLOCAR EL DIA */
and Extract (Month From T.TRANSACTION_DATE) = 05 /*<--- COLOCAR EL MES */
and Extract (Year From T.TRANSACTION_DATE) = 2005 /*<--- COLOCAR EL AÑO */
and T.BRANCH_CODE in (4,5,8) /*<----- Colocar las Terminales que se incluyen) */

Por favor si alguien me puede decir en que me estoy equivocando (no vale decir profesión).:D

Desde ya muchas gracias.

ContraVeneno 24-01-2007 17:28:36

El problema aqui esta en que los tipos de datos no coinciden, por eso te marca ese error, lo que tienes que hacer es un CAST para que los tipos de datos sean iguales...

Código SQL [-]
... M.Description as Descripcion, ...
--supongo que aquí es donde no coinciden, dale el mismo tamaño que tiene el campo descripcion
... Cast('TOTAL' as char(30) As Descripcion , ...

si eso no te lo resuelve, prueba hacer un cast tambien al campo terminal.

fdelamo 24-01-2007 17:32:26

En Interbase 1.0 no se, pero en Firebird, en los UNION, los campos deben ser exactamente iguales.

En tu ejemplo M.Description as Descripcion y 'TOTAL' as Descripcion, por lo que debes hacer un CAST

Ej:
Código SQL [-]
CAST('TOTAL' AS VARCHAR(50)) AS Descripcion
, suponiendo que el campoM.Descripcion sea un VARCHAR(50). Esto debes hacerlo para todos los campos

Espero que te sirva de ayuda

Un saludo

Carmelo Cash 24-01-2007 17:44:16

Gracias
 
Gracias mil!!!

Funcionó como me dijeron, colocando Cast en los dos primeros campos.

Nuevamente gracias!!!


Select
Cast(T.BRANCH_CODE as Varchar(10)) as Terminal,
Cast(M.Description as Varchar(30)) As Descripcion,
sum(T.TOTAL_AMOUNT) as Total
...
...

UNION

Select
cast(Count(Distinct(T.BRANCH_CODE)) as VarChar(10)) As Terminal,
Cast('TOTAL' as Varchar(30)) As Descripcion,
Sum(T.TOTAL_AMOUNT) As Total
....

ContraVeneno 24-01-2007 17:58:56

que bueno, aunque no es necesario hacerlo en las dos consultas... solo es necesario que la segunda, tenga el mismo tipo de datos que la primera. ;)


La franja horaria es GMT +2. Ahora son las 16:24:54.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi