Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Vistas con Sentecia CASE o Condicional en una columna.

1,497 views
Skip to first unread message

Luis Alejandro Leal

unread,
Dec 11, 2001, 3:52:25 PM12/11/01
to
Saludos a todos,

quiero realizar una vista, con las siguientes sentencias:

SELECT E.destino, SUM(E.Horas) AS THoras, SUM(CASE modulo WHEN 1 THEN
e.cantidad*e.valor ELSE 0 END) AS MP,
FROM MATERIA AS E
GROUP BY E.destino

es decir, esta agrupada y unas columnas son sumas, pero, no me deja generar
una columna utilizando la sentencia CASE, pero es necesario para los
resultados.
Como puedo hacer una sentencia de condición en una columna, o que hay de
erroneo en la instrucción descrita.


Gracias de antemano...
--
Luis Alejandro Leal Rey
UDESOFT LTDA - Co.

Fernando G. Guerrero

unread,
Dec 11, 2001, 3:53:06 PM12/11/01
to
No hay nada de malo utilizando CASE dentro de SUM:

USE Northwind
GO

SELECT OrderID, SUM(Quantity) AS Units, SUM(CASE discount WHEN 0 THEN
quantity*UnitPrice ELSE quantity*UnitPrice*(1-discount) END) AS Precio
FROM [Order details]
GROUP BY OrderID

Lo que tienes mal en tu consulta es una coma de más antes del FROM (AS MP,
en vez de AS MP). Prueba así:

SELECT E.destino, SUM(E.Horas) AS THoras, SUM(CASE modulo WHEN 1 THEN
e.cantidad*e.valor ELSE 0 END) AS MP

FROM MATERIA AS E
GROUP BY E.destino

--
Fernando G. Guerrero
SQL Server MVP
QA plc., UK
PASS Spanish Group
www.sqlserverbyexample.com
www.callsql.com
www.qa.com

"Comparte lo que sabes, aprende lo que no sepas"

Me enorgullezco de colaborar con la comunidad de usuarios de PASS (la
Asociación Profesional de SQL Server). Busca más información en:
http://www.sqlpass.org

"Luis Alejandro Leal" <ll...@udesoft.com> wrote in message
news:OTe99SogBHA.1872@tkmsftngp04...

Luis Alejandro Leal

unread,
Dec 11, 2001, 4:12:04 PM12/11/01
to
Si como tu dices, la consulta funciona bien, pero yo deseo crearla como una
vista, y al ejecutar la sentencia dentro de la nueva vista me resulta el
error, "El Diseñador de consultas no admite la interpretación SQL de CASE."
Ahh y disculpa por la coma, pero solamente fue al pasar la consulta a el
grupo de noticias.

Gracias por cualquier ayuda que me puedas dar.


"Fernando G. Guerrero" <fer...@guerrerog.org> escribió en el mensaje
news:O#OsrXogBHA.1868@tkmsftngp05...

Fernando G. Guerrero

unread,
Dec 11, 2001, 4:16:01 PM12/11/01
to
El que el diseñador de consultas no entienda la función CASE no quiere decir
que SQL Server no la entienda. Puedes crear una vista perfectamente en esa
consulta. Prueba esto en Query Analyzer:

Use northwind
GO

CREATE VIEW Precios
AS


SELECT OrderID, SUM(Quantity) AS Units, SUM(CASE discount WHEN 0 THEN
quantity*UnitPrice ELSE quantity*UnitPrice*(1-discount) END) AS Precio
FROM [Order details]
GROUP BY OrderID

GO

SELECT *
FROM Precios

Verás como funciona perfectamente.

El diseñador de consultas es una utilidad basada en DaVinci Tools (también
llamado Visual Database Tools) con una funcionalidad muy limitada. Es mejor
que crees las vistas mediante las instrucciones Transact-SQL adecuadas, en
Query Analyzer. En cualquier caso, el mensaje que mencionas solo indica que
el Diseñador de Consultas no sabe cómo mostrar esta consulta gráficamente,
pero puedes almacenarla y ejecutarla dentro del mismo diseñador.

--
Fernando G. Guerrero
SQL Server MVP
QA plc., UK
PASS Spanish Group
www.sqlserverbyexample.com
www.callsql.com
www.qa.com

"Comparte lo que sabes, aprende lo que no sepas"

Me enorgullezco de colaborar con la comunidad de usuarios de PASS (la
Asociación Profesional de SQL Server). Busca más información en:
http://www.sqlpass.org

"Luis Alejandro Leal" <ll...@udesoft.com> wrote in message

news:uj6r8dogBHA.1964@tkmsftngp02...

Luis Alejandro Leal

unread,
Dec 11, 2001, 4:43:53 PM12/11/01
to
Exacto, muchas gracias por tu ayuda.....

al igual, si puedes, me gustaría que me dieras tu opinión sobre la pregunta
que realice el día 10/12/2001 con asunto "Vistas con parámetros", en si,
este era el inconveniente principal, y el que muy amablemente Carlos
Sacristán me dio su ayuda y cooperación.

en general lo que necesito saber es como puedo realizar un procedimiento
principal que tenga parámetros y que tambien estos se pasen a un
procedimiento anidado, pero que este procedimiento anidado se encuentre
dentro de un select, es decir, porderlo tratar como una tabla o vista.

De todas maneras, muchas gracias por tu colaboración oportuna y eficaz

Luis Alejandro Leal


"Fernando G. Guerrero" <fer...@guerrerog.org> escribió en el mensaje

news:OBbNfkogBHA.2072@tkmsftngp03...

Fernando G. Guerrero

unread,
Dec 11, 2001, 5:02:41 PM12/11/01
to
La solución elegante a este problema es utilizar funciones definidas por el
usuario en SQL Server 2000, ya que funcionan como procedimientos
almacenados, pero se pueden utilizar en la cláusula FROM (tal y como te
aconsejó Miguel).

Si quieres ejecutar un procedimiento almacenado utilizando su resultado
dentro de un SELECT, puedes utilizar OPENQUERY:

EXEC sp_serveroption [TuServidor], 'data access', true

SELECT * FROM OPENQUERY([FGGADVENT\S2KDev], 'EXEC sp_help') AS A

El problema viene con los parámetros, ya que la función OPENQUERY no admite
variables, sino strings constantes. Lo que sí puedes hacer es construir toda
tu consulta en una variable varchar(8000), incluyendo la llamada a OPENQUERY
y ejecutarla mediante EXECUTE (@query), como en el siguiente ejemplo:

CREATE Procedure DimeProducto
@ID int
AS
SELECT *
FROM Products
WHERE ProductID = @ID
GO

DECLARE @a varchar(8000)
DECLARE @ID int
DECLARE @query varchar(8000)

SET @ID = 15
SET @a = 'EXEC Northwind.dbo.DimeProducto ' + CAST(@ID as varchar(10))

SET @query = 'SELECT * FROM OPENQUERY([TuServidor], '''
+ @a + ''') AS A'

EXEC (@query)

Utilizando funciones definidas por el usuario, la solución habría sido tan
sencilla como la siguiente:

CREATE FUNCTION fnDimeProducto(@ID int)
RETURNS @t TABLE (ProductName nvarchar(40), UnitPrice money)
AS
BEGIN
-- Aquí puedes insertar tantas instrucciones como necesites

INSERT @t
SELECT ProductName, UnitPrice
FROM Products
WHERE ProductID = @ID

RETURN
END

GO

-- Y la utilizas así:

SELECT *
FROM fnDimeProducto(16)

--
Fernando G. Guerrero
SQL Server MVP
QA plc., UK
PASS Spanish Group
www.sqlserverbyexample.com
www.callsql.com
www.qa.com

"Comparte lo que sabes, aprende lo que no sepas"

Me enorgullezco de colaborar con la comunidad de usuarios de PASS (la
Asociación Profesional de SQL Server). Busca más información en:
http://www.sqlpass.org

"Luis Alejandro Leal" <ll...@udesoft.com> wrote in message

news:OhsbuvogBHA.2072@tkmsftngp03...

Luis Alejandro Leal

unread,
Dec 11, 2001, 5:35:23 PM12/11/01
to
Una vez más, MUCHAS GRACIAS, ...
Funciona corectamente

Siempre es complicado cuando se comienza, pero es importante encontrar apoyo
y soluciones para no desistir en el intento.

Agradezco tu tiempo y tu colaboración ....................... se que te he
agradecido mucha veces pero siendo esta la única manera de espresarte mi
agradecimientos, ya que si pudiera , por tu ayuda te nombraba padrino de uno
de los hijos que pienso tener.. :)


"Fernando G. Guerrero" <fer...@guerrerog.org> escribió en el mensaje

news:OvMGk#ogBHA.1552@tkmsftngp02...

Fernando G. Guerrero

unread,
Dec 11, 2001, 6:23:22 PM12/11/01
to
Gracias por tus amables comentarios!

La verdad es que si aceptara más ahijados, los que ya tengo se me quejarían,
pero quedo honrado por el ofrecimiento.

Ya nos tomaremos alguna cerveza en algún sitio.

--
Fernando G. Guerrero
SQL Server MVP
QA plc., UK
PASS Spanish Group
www.sqlserverbyexample.com
www.callsql.com
www.qa.com

"Comparte lo que sabes, aprende lo que no sepas"

Me enorgullezco de colaborar con la comunidad de usuarios de PASS (la
Asociación Profesional de SQL Server). Busca más información en:
http://www.sqlpass.org

"Luis Alejandro Leal" <ll...@udesoft.com> wrote in message

news:OVb1fMpgBHA.1568@tkmsftngp07...

0 new messages