Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/02/2013, 06:41
1antares1
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 1 mes
Puntos: 0
Exclamación ERROR no se puede convertir datos varchar a numeric

Buenas noches....

Estimados Foristas Experos en SQL SERVER.

Tanto buscar y buscar, no encuentro una solución específica, o únicamente, algo que me oriente a terminar mi reporte necesario para mi pequeño Restaurant.

Lo único que me hace falta, es sacar el promedio y que la sintaxis nombrada, funcione para SQL SERVER 2005, ya que en 2008 funciona perfecto.

Si de algunos de ustedes, se ofrecen a prestar una ayuda comunitaria, estaría agradecido.

Lo primero:

Código MySQL:
Ver original
  1. SELECT CASE REGIMEN
  2. WHEN 1 THEN 'DESAYUNO'
  3. WHEN 2 THEN 'ALMUERZO'
  4. WHEN 3 THEN 'CENA'
  5. END "REGIMEN", CONVERT(VARCHAR(10),SUM(BASEIMPONIBLE)) + ' Bs.' AS 'BASE IMPONIBLE',
  6.  
  7. WHEN REGIMEN = 1 THEN CAST(CONVERT(VARCHAR(50),CONVERT(NUMERIC(10,2),SUM(BASEIMPONIBLE)) * 100 / (SELECT SUM(BASEIMPONIBLE)
  8. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado))AS VARCHAR(10)) + '%'
  9. /*CONVERT(VARCHAR(10),SUM(TIQUETSCAB.NUMCOMENSALES) * 100 / 300) + '%' AS 'PROMEDIO'*/
  10. WHEN REGIMEN = 2 THEN CONVERT(DECIMAL(10,2),SUM(BASEIMPONIBLE) * 100 / (SELECT SUM(BASEIMPONIBLE)
  11. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado))
  12. /*NUMERIC = LO MISMO QUE DECIMAL */
  13. WHEN REGIMEN = 3 THEN CONVERT(DECIMAL(10,2),SUM(BASEIMPONIBLE) * 100 / (SELECT SUM(BASEIMPONIBLE)
  14. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado))
  15. /*=(B1*100/(B1+B2+B3)) */
  16. END "PROMEDIO",
  17.  
  18. SUM(COMENSALES) AS 'COMENSALES'
  19. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado
  20. GROUP BY REGIMEN

Fíjense en la línea Número 9.

Me da el error mostrado:
ERROR no se puede convertir datos varchar a numeric
¿Por qué? En la línea 5 no me ofreció inconveniente, y aquí si.

Al parecer no estoy haciendo la conversión verdadara O NO se le añade caracteres a números decimales.

Lo segundo:

Código SQL:
Ver original
  1. SELECT CASE REGIMEN
  2. WHEN 1 THEN 'DESAYUNO'
  3. WHEN 2 THEN 'ALMUERZO'
  4. WHEN 3 THEN 'CENA' ELSE 'FUERA DE RANGO'
  5. END "REGIMEN",
  6.  
  7. CONVERT(VARCHAR(10),SUM(BASEIMPONIBLE)) + ' Bs.' AS 'BASE IMPONIBLE',
  8.  
  9. CASE
  10. WHEN REGIMEN = 1 THEN CAST(CONVERT(DECIMAL(10,2),SUM(BASEIMPONIBLE) * 100 / (SELECT SUM(BASEIMPONIBLE)
  11. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado WHERE FECHA >= '20130101' AND FECHA <= '20130131'))AS VARCHAR(10))
  12. /*CONVERT(VARCHAR(10),SUM(TIQUETSCAB.NUMCOMENSALES) * 100 / 300) + '%' AS 'PROMEDIO'*/
  13. WHEN REGIMEN = 2 THEN CAST(CONVERT(DECIMAL(10,2),SUM(BASEIMPONIBLE) * 100 / (SELECT SUM(BASEIMPONIBLE)
  14. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado WHERE FECHA >= '20130101' AND FECHA <= '20130131'))AS VARCHAR(10))
  15. /*NUMERIC = LO MISMO QUE NUMERIC */
  16. WHEN REGIMEN = 3 THEN CAST(CONVERT(DECIMAL(10,2),SUM(BASEIMPONIBLE) * 100 / (SELECT SUM(BASEIMPONIBLE)
  17. FROM NUEVO_REST_IKEA.DBO.IkeaHorasReporteAgrupado WHERE FECHA >= '20130101' AND FECHA <= '20130131'))AS VARCHAR(10))
  18. /*=(B1*100/(B1+B2+B3)) */
  19. END "PROMEDIO"
  20.  
  21. FROM IkeaHorasReporteAGrupado
  22. WHERE FECHA >= '20130101' AND FECHA <= '20130131'
  23. GROUP BY REGIMEN ORDER BY SUM(BASEIMPONIBLE) ASC

La sintaxis funciona correctamente (ya cuando desistí de agregarle el % adicional). Únicamente que en SQL 2005, no me funciona.

Comenta algo sobre la cláusala WHERE con EXISTS tal... ¿Será por los SELECT´s anidados? Quitándolo, me funciona.

Ahí ustedes pueden ver la conversión o el promedio que se le saca al 100%.

Agradecidos por sus comentarios y objeciones.

Saludos.
__________________
:si: ANTARES:si: