es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

SQL: Agrupar por con case para establecer valores para ambas condiciones.

Precondición: [Estoy usando la semana con el domingo como primer día de la semana]
Tengo la tabla ‘#TT’ como se muestra a continuación:


<h2>Columna -> D_Date</h2> 2020-12-27 | 2020-12-28 | 2020-12-29 | 2020-12-30 | 2020-12-31 | 2021-01-01 | 2021-01-02 |

Quiero obtener los números de semana para cada fecha, y en caso de que el año termine con el comienzo del nuevo año, quiero marcar la primera semana como 0 para el nuevo año si su contribución de días es menor a 4 días, esto es:</p>

<p>Según la semana en los EE. UU.
<code>
2020-12-27 a partir de esta 53.ª semana

2020-12-28

2020-12-29

2020-12-30

2020-12-31

2021-01-01

2021-01-02 y termina aquí

</code>
En lo anterior, del 27 al 31 son 5 días de 2020, mientras que para el 1 y 2 de 2021 son 2 días, por lo tanto, la mayoría de los días son de 2020 y no de 2021.
Ahora quiero marcar el número de semana para 2021 como 0 para las fechas 1 y 2 y no como 1.</p>

<p>Estoy usando la siguiente consulta, pero también disminuye el número de semana del año mínimo. ¿Cómo puedo lograr esto? Ayúdame por favor.</p>

<p>“`SQL
SELECT

DATEPART( week, D_Date ),

CASE
    WHEN COUNT( DATEPART( week, D_Date ) ) > 1 THEN MAX( DATEPART(week, D_Date ) - 1 ) 
    ELSE DATEPART( week, D_Date )

END AS [Estado]
FROM
#tt
GROUP BY
DATEPART( year, DDate ),
DATEPART( week, D
Date );
“`

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, se puede modificar la sentencia CASE para comprobar si el primer día de la semana está en el nuevo año y si el número de días de esa semana es menor de 4. Si ambas condiciones son verdaderas, entonces se marca la semana como 0, de lo contrario se resta 1 del número de semana. Aquí está la consulta modificada:

    SELECT
        DATEPART(semana, D_Fecha) AS [Semana],
        CASE 
            WHEN DATEPART(dia_semana, MIN(D_Fecha)) = 1 AND DATEDIFF(dia, MIN(D_Fecha), DATEADD(dia, 6, MIN(D_Fecha))) < 3 
                THEN 0 
            ELSE DATEPART(semana, D_Fecha) - 1 
        END AS [Estado]
    FROM
        #TT
    GROUP BY
        DATEPART(año, D_Fecha),
        DATEPART(semana, D_Fecha)
    ORDER BY
        [Semana]
    

    Esto debería darle los números de semana correctos para cada fecha y marcar la primera semana del año con menos de 4 días como 0.

Comments are closed.