Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Estas en el tema de Valores Repetidos (Dejar una cifra real y demás en 0) [CASE] en el foro de SQL Server en Foros del Web. Buenas tardes, estimados foreros... No sé si alguno ha tenido este tipo de consulta o determinada situación, ya que me encuentro con una gran consulta, ...
  #1 (permalink)  
Antiguo 07/05/2013, 12:38
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 8 meses
Puntos: 0
Pregunta Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Buenas tardes, estimados foreros...

No sé si alguno ha tenido este tipo de consulta o determinada situación, ya que me encuentro con una gran consulta, y los Números Repetidos, me los da por que conozco la razón, y la relación está perfecta. Todo bien! Y DISTINCT no me sirve, por que no es el caso de eliminar TODOS los valores. Ya que existen montos (importe) que son repetidos, pero deberían estar allí.

El caso es así:

Tengo una Fiesta, que asistieron 10 personas, pero cada 1 comió algo diferente, cada uno pagó por su parte, pero el número de la Fiesta son 10.

La consulta me sale así:

Código MySQL:
Ver original
  1. [B]CLIENTE           [/B][B]TIPO_FIESTA             [/B][B]TOTAL_PERSONAS              [/B][B]CONSUMIDO[/B]
  2. 1                            BODA                               10                              BUFFET
  3. 33                          BODA                               10                             BUFFET P.
  4. 20                          BODA                               10                           2 CERVEZAS
  5. 150                        BODA                               10                           1 WISKIE B.
  6. 3                            BODA                               10                                NULL
  7. 56                          BODA                               10                                NULL
  8. 98                          BODA                               10                           10 CERVEZAS
  9. 3332                      BODA                               10                      RACIÓN TEQUEÑOS
  10. 99                          BODA                               10                          HAMBURGUESA
  11. 43                          BODA                               10                               BUFFET

La cuestión, es que si poseo 4 fiestas, y cada una posee 10 personas, me dará un total de 100 por cada fiesta, siendo 400, y realmente, un total, son 40.

No sé si me pueda explicar bien. Yo quisiera conseguir un método, y creo que lo ideal sería con CASE, que poseo la idea, pero la Sintaxis no sabría como ajustarla.

Que el resultado lo genere así:

Código SQL:
Ver original
  1. [B]CLIENTE           [/B][B]TIPO_FIESTA             [/B][B]TOTAL_PERSONAS              [/B][B]CONSUMIDO[/B]
  2. 1                            BODA                               0                              BUFFET
  3. 33                          BODA                               0                            BUFFET P.
  4. 20                          BODA                               0                           2 CERVEZAS
  5. 150                        BODA                               0                           1 WISKIE B.
  6. 3                            BODA                               0                                NULL
  7. 56                          BODA                               0                                NULL
  8. 98                          BODA                               0                           10 CERVEZAS
  9. 3332                      BODA                               0                      RACIÓN TEQUEÑOS
  10. 99                          BODA                               0                          HAMBURGUESA
  11. 43                          BODA                               10                               BUFFET


Es decir, que por CADA CAMPO PRINCIPAL o CODIGO DE ACTIVIDAD (FIESTA), me reste todos menos 1, el real, sea el principal o el último.

Y al sacar un SUM total, me de la cantidad real de la cantidad de personas que vinieron a las fiestas por 1 mes, 1 año, entre otros.

Espero y aspiro la comprensión de lo indicado. Si alguno posee alguna idea o solución, siendo fácil o dificil, estaría agradecido del mismo.

Un cordial saludo.
__________________
:si: ANTARES:si:
  #2 (permalink)  
Antiguo 07/05/2013, 13:08
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

te explicas mejor?? que es lo que quieres hacer? que tenga un campo el 10 y los demas 0, en tu ejemplo pones que el id 43, pero que condicion usas para que sea el 43?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 07/05/2013, 13:34
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 8 meses
Puntos: 0
Exclamación Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Gracias por su respuesta, Libras.

Exactamente, lo que me dices. Colocar la cantidad registrada de Nro. de personas, pero SOLO 1 VEZ y las demás estén en 0, en la cantidad de registros que use, de acuerdo a las claves principales.

Lo del Cliente, fue un ejemplo. Pero siempre son claves primarias relacionadas a otras tablas. El agarra solo el código del cliente. Pero imaginemos que la principal sea un CODIGO DE EVENTO, y me agarre de ahí. Es decir, que el código evento en este caso, se repite en todas las veces, por ser 1 EVENTO [FIESTA].

En ese caso, solo necesito que dicho evento, me diga que hubieron 10 Personas y no 100, ya que SI necesito que me muestre todo lo consumido.

Reitero mi agradecimiento del caso. Cordial saludo.
__________________
:si: ANTARES:si:
  #4 (permalink)  
Antiguo 07/05/2013, 13:43
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

y porque no lo haces con una consulta de este tipo:

select count(id_cliente) as total, tipo_fiesta from tabla group by tipo_fiesta

asi te daria el total de personas por fiesta, que es realmente la informacion que ocupas el total de personas por fiesta no?? porque necesitas que este la informacion en 0 en todos los renglones menos en 1?
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 07/05/2013, 14:33
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Por supuesto, yo poseo esa consulta y me la da por separada.

Pero resulta que en una consulta con múltiples tablas, y una de ellas, es una relacionada para sacar la cantidad de personas, me repite los resultados.

Es decir, los datos de valores repetidos me la da como muestras así en el primer ejemplo.

Y al final de todo, necesito sacar un total de cada columna (Total de Nro. de Personas), y con valores repetidos, me sumará todos y no el verdadero, y no me cuadraría en mi gestor de reportes de mi aplicación como para sumar en forma de Cubo.

Al estar todos en 0, menos 1 desde la FIESTA principal, me daría la suma o total real al final.

Yo pude sacar el total, y colocarlo en otra columna, y con variable temporal y unirla. Pero no me sirve así, ya que si quisiera conocer 2 fiestas de múltiples consumos (100 líneas), y conocer cuantas personas estuvieron ahí, tendré que sacarlo a mano.

Espero que su comprensión sea detallista y paciente para mi gran parrafal y forma de intentar describir jejeje!

Cordial saludo, amigo Libras.
__________________
:si: ANTARES:si:
  #6 (permalink)  
Antiguo 07/05/2013, 15:08
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Código SQL:
Ver original
  1. CREATE TABLE #temp
  2. (
  3. id INT,
  4. fiesta VARCHAR(20),
  5. consumo VARCHAR(50)
  6. )
  7.  
  8. INSERT INTO #temp VALUES (1,                            'BODA',                                 'BUFFET')
  9. INSERT INTO #temp VALUES (33,                          'BODA',                           'BUFFET P.')
  10. INSERT INTO #temp VALUES (20,                          'BODA',                                  '2 CERVEZAS')
  11. INSERT INTO #temp VALUES (1,                            'BODA2',                                 'BUFFET')
  12. INSERT INTO #temp VALUES (33,                          'BODA2',                           'BUFFET P.')
  13. INSERT INTO #temp VALUES (20,                          'BODA2',                                  '2 CERVEZAS')
  14. INSERT INTO #temp VALUES (21,                            'BODA2',                                 'BUFFET')
  15. INSERT INTO #temp VALUES (22,                          'BODA2',                           'BUFFET P.')
  16. INSERT INTO #temp VALUES (34,                          'BODA2',                                  '2 CERVEZAS')
  17. INSERT INTO #temp VALUES (21,                            'BODA2',                                 'BUFFET')
  18. INSERT INTO #temp VALUES (22,                          'BODA2',                           'BUFFET P.')
  19. INSERT INTO #temp VALUES (34,                          'BODA2',                                  '2 CERVEZAS')
  20.  
  21.  
  22.  
  23. SELECT *,
  24. CASE WHEN (SELECT top 1 id FROM #temp GROUP BY id,fiesta)=id THEN
  25. (
  26. SELECT total FROM (SELECT COUNT(id) total,fiesta FROM #temp GROUP BY fiesta) AS t1 WHERE t1.fiesta=#temp.fiesta
  27. ) ELSE 0 END AS total FROM #temp GROUP BY id,fiesta,consumo

saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #7 (permalink)  
Antiguo 08/05/2013, 11:58
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

y funciono o no???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 13/05/2013, 07:18
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Buen día, amigo Libras.

Voy a verificar el código con mi consulta, y probaré y te aviso.

Disculpa la tardanza en respuesta. No respondí por que aún no he probado, me encontraba de viaje.

Luego te avisaré si funcionó o no, debido a que tengo que adaptarlo a mi reporte.

Gracias por tu ayuda y comprensión.

Un cordial saludo.
__________________
:si: ANTARES:si:
  #9 (permalink)  
Antiguo 15/05/2013, 19:12
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 8 meses
Puntos: 0
Pregunta Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Buenas noches, amigo Libras nuevamente...

Aquí nuevamente me dediqué hoy a quemar la consulta con dicha consulta con tu algoritmo prestado, y pues realmente aún no fue lo conseguido, te explico:

Me estás dando un ejemplo que cuenta la cantidad de líneas o "Eventos". El suma cada evento como 1 fila y lo suma, y eso no es lo que me refiero.

Ya la consulta me da el Número de Personas. Lo que deseo es que ese numero de personas quede fijo en 1 fila y el resto repetidas, valor 0 o "NULL".

Es decir, ya yo poseo esa columna. Sería bien hacer otra al lado, con el mismo resultado, pero que solo 1 Registro repetido (Ej.: Serie: AA, Numero: 100, Nro_Personas: 50) -Serie y Numero son Claves primarias- quede en la nueva columna o la actual: 50 y el resto 0, 0, 0. ¿Por qué 3? Suponiendo que fue 1 FIESTA, pero el consumo de refrigerio fue distinto y por ende, lo repetido.

Espero que me hayas comprendido. Si deseas, verifica la tabla anterior que te dejé, en caso de ofrecerte una explicación confusa, mis disculpas! Pero esto es lo deseado.

De igual forma, no nos limitemos con el "CASE", si es posible entonces crear alguna vista, o tabla temporal, bien. No hay problema! Solo que con Case When me evito registrar o consultar cosas adicionales.

Agradecido.

Cordial saludo.
__________________
:si: ANTARES:si:
  #10 (permalink)  
Antiguo 16/05/2013, 08:23
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

la consulta que te recomende regresa el resultado que tenias en la tabla que pusiste como ejemplo, puedes explicarte con peras y manzanas(datos) o porque dices que la consulta que te pase no funciona si suma el total de personas y lo pone en la primer columna(si quieres que sea la ultima ps tambien se puede)
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #11 (permalink)  
Antiguo 25/05/2013, 10:57
 
Fecha de Ingreso: marzo-2006
Mensajes: 43
Antigüedad: 18 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Valores Repetidos (Dejar una cifra real y demás en 0) [CASE]

Buen día, Amigo Libras.

Disculpe la tardanza en responder, no acostumbro a dejar un tema sin finalizar o desprendido para quienes acostumbramos a mantener la organización de contribución entre todos en el Foro.

A la final, pude comprender el resultado deseado (no sé hasta que punto pudiste interpretar lo sugerido en mi comentario, aunque sé que estuvo algo confuso), y usando un procedimiento usando distintas funciones en las que me tenía que leer del libro para conseguir la concordancia final, es decir:

Código MySQL:
Ver original
  1. SELECT A.SERIE, A.NUMERO, A.NOMBRECLIENTE, A.CIF, A.POBLACION, A.PAIS, A.NOMVENDEDOR,
  2. A.NOMRECURSO, A.UNIDADES, A.CODARTICULO, A.TIPO_SECCION, A.DESCRIPCION_CARGOS, A.REFERENCIA,
  3. A.CONCEPTO, A.TITULO, A.SERIEFAC, A.NUMEROFAC, A.IMPORTE,
  4. A.ESTADO, A.TAMANO, A.TIPO_AMBIENTE, A.HORAINICIO, A.FECHA1 AS MES, A.FECHA2 AS DIA, A.FECHA3 AS FECHA_EVENTO,
  5. A.FECHAFAC1 AS MES_FACTURADO, A.FECHAFAC2 AS DIA_FACTURADO, A.FECHAFAC3 AS FECHA_FACTURADO, A.DPTO, A.SECCION, A.NROPERSONAS,
  6.  
  7. CASE WHEN RN = 1 THEN A.NROPERSONAS ELSE 0 END COMENSALES_TOTAL
  8.  
  9. FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY NUMERO ORDER BY (SELECT 0)) AS RN FROM @REPORTEGENERAL) A
  10.  
  11. WHERE A.FECHAFAC3 BETWEEN '20130201' AND '20130228'

La interpretación de la sintaxis, me hace decir que si se repite, colóquele 0, del resto! Solo 1 devuelto tendrá la cantidad real de lo encontrado.

Quisiera decir que 1 evento con 10 consumidos, me repetirá en la tabla del Nro_Personas 10 veces. Pero al ofrecerle un TOTAL, el Nro_Personas me lo sumará, y lo que deseaba es que 9 fuesen 0 y 1 el total.

Ya el número lo tenía, no necesitaba contar por ello que te había explicado.

Un cordial saludo. Reitero nuevamente un agradecimiento por tu comprensión y ánimos de conseguir la posible solución.

Felíz día.
__________________
:si: ANTARES:si:

Etiquetas: reporte, sql, sqlserver2008, validacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:36.