Acondicionamiento de recuento de SQL sin los valores 0

CorePress2024-01-24  11

Estoy intentando ejecutar un recuento de casos en SQL pero quiero los resultados sin el 0, ¿cómo lo hago?

Select ClubName,
       ClubType,
       Country,
       Concat(Count(case when GameResult like 'w%' then 1 else NULL end), ' ','wins'),
       Count(Case when GameResult like 'l%' then 1 end) AS Losses
  from ClubDim,CountryDim,GamesFact
 where ClubDim.CountryID = CountryDim.CountryID
   And ClubDim.ClubID = GamesFact.ClubID
 GROUP BY ClubName,ClubType,Country,GameResult
Having ClubType = 'Professional'

Ese es el código y obtengo muchos ceros y mi objetivo es contar las pérdidas y las ganancias en dos columnas separadas

¿Qué quieres decir con "sin el 0"? ¿Quieres filtrarlos? Etiqueta tu pregunta con la base de datos que estás utilizando.

- Gordon Linoff

27/03/2021 a las 12:03

2

No destroces tu pregunta.

-forpas

27/03/2021 a las 18:18



------------------------------------

Obviamente no es posible realizar pruebas sin datos de muestra; sin embargo, aquí debería usar la suma, no contar. Sus criterios de tener deben ser parte de la cláusula donde, ya que no está filtrando de forma agregada. ¡También recomendaría usar la sintaxis de unión adecuada que ha sido estándar desde 1992! Sin embargo, esto debería darle los resultados esperados., sospecho.

Select ClubName,
    ClubType,
    Country,
    Concat(sum(case when GameResult like 'w%' then 1 else 0 end), ' ','wins'),
    Sum(Case when GameResult like 'l%' then 1 else 0 end) AS Losses
from ClubDim,CountryDim,GamesFact
where ClubDim.CountryID = CountryDim.CountryID and ClubDim.ClubID = GamesFact.ClubID
and ClubType = 'Professional'
GROUP BY ClubName,ClubType,Country,GameResult



------------------------------------

El problema es que has puesto gameResult en el grupo por.

Más importante aún, necesita aprender la sintaxis JOIN adecuada, explícita, estándar y legible. Hacer un producto cartesiano y filtrar en la cláusula WHERE es simplemente incómodo. No utilizar la sintaxis adecuada está desactualizado:

select cl.ClubName, cl.ClubType, co.Country, 
       Concat(Count(case when g.GameResult like 'w%' then 1 else NULL end), ' ', 'wins'),
       Count(Case when g.GameResult like 'l%' then 1 end) AS Losses
from ClubDim cl join
     CountryDim co
     on cl.CountryID = co.CountryID join
     GamesFact g
     on cl.ClubID = g.ClubID
where cl.ClubType = 'Professional'
group by cl.ClubName, cl.ClubType, co.Country;

Además:

Tenga en cuenta el uso de alias de tablas. Deben ser abreviaturas de los nombres de las tablas. Hice lo mejor que pude para calificar todas las columnas, para que quede claro de qué tablas provienen. Por supuesto, su pregunta no proporciona esta información, por lo que esto es solo una suposición. Filtrarantes de agregar usando una cláusula WHERE en lugar de filtrar después de agregar con HAVING. Utilice HAVING cuando desee filtrar los resultados de agregaciones (como COUNT(*)).

2

¡Funcionó! ¡muchas gracias! y gracias por las notas. Todavía estoy aprendiendo SQL y todo esto lo aprendí yo mismo, por eso es tan complicado.

-Hany Youssef

27/03/2021 a las 13:44

pero solo quería preguntar cómo se escribe la consulta en puente de esta manera y cómo uso las abreviaturas antes de las columnas' nombres (como cl. y co.)

-Hany Youssef

27/03/2021 a las 13:50



------------------------------------

Puedes probar la siguiente consulta:

SELECT ClubName,
       ClubType,
       Country,
       CASE WHEN Wins > 0 THEN CONCAT(Wins , ' wins') ELSE NULL END WINS,
       loses
FROM (SELECT ClubName,
             ClubType,
             Country,
             Count(case when GameResult like 'w%' then 1 else NULL end) AS Wins,
             Count(Case when GameResult like 'l%' then 1 end) AS Losses
        FROM ClubDim CLD
        JOIN CountryDim COD ON CLD.CountryID = COD.CountryID
        JOIN GamesFact GF ON CLD.ClubID = GF.ClubID
       where ClubType = 'Professional'
       GROUP BY ClubName,ClubType,Country) X;

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare