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.

CREATE VIEW calendario AS SELECT dia, mes, año, semana, día_semana FROM calendario_principal ORDER BY año, mes, dia;

Estoy buscando algunas ideas para crear una vista de calendario a partir de una tabla en SQL. Los requisitos son los siguientes. Por favor, dame consejos sobre cómo transponer por el número de dígitos dentro de una celda de datos.

La tabla A contiene el año (JAHR) y los días de MON1 a MON12 (enero a diciembre).
El valor dentro de los días MON1 a MON12 es el siguiente:

  • 1 significa día laboral
  • 0 significa día festivo
  • El dígito 1 significa el primer día del mes, el dígito 2 significa el segundo día del mes, y así sucesivamente.

Me gustaría crear una vista como la siguiente:

Año_JAHR Mes Fecha Día Laboral
2022 1 1 1
2022 1 2 1
2022 1 3 0
~ ~ ~ ~
2022 1 31 1
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear la vista de calendario deseada a partir de la Tabla A en SQL, puedes seguir estos pasos:

    1. Utiliza la instrucción SELECT de SQL para consultar las columnas requeridas de la Tabla A: Year_JAHR, Days_MON1 – Days_MON12.
    2. Utiliza el operador UNION de SQL para combinar los datos de todos los meses (Days_MON1 – Days_MON12) en un único conjunto de resultados.
    3. Utiliza el operador CROSS APPLY de SQL para aplicar una función de tabla que divida los valores de Days_MON (que se almacenan como un solo número) en filas separadas según el número de dígitos de cada valor.
    4. Agrega cálculos para convertir los valores de Days_MON en fechas reales (utilizando Year_JAHR y el número de mes) y para determinar la columna WorkingDay basada en si el valor de Days_MON es 0 o 1.
    5. Utiliza la cláusula ORDER BY de SQL para ordenar los resultados por Year_JAHR y fecha, si es necesario.

    Una consulta de ejemplo para crear la vista de calendario se vería algo como esto:

    SELECT
      Year_JAHR,
      Mes,
      CAST(Mes AS VARCHAR) + '-' + CAST(Fecha AS VARCHAR) AS Fecha,
      DiaLaboral
    FROM
      (
        SELECT
          Year_JAHR,
          1 AS Mes,
          Days_MON1 AS Days_MON
        FROM
          TablaA
        UNION
        SELECT
          Year_JAHR,
          2 AS Mes,
          Days_MON2 AS Days_MON
        FROM
          TablaA
        UNION
        -- repetir para los meses 3-12
        SELECT
          Year_JAHR,
          12 AS Mes,
          Days_MON12 AS Days_MON
        FROM
          TablaA
      ) AS DatosMensuales
    CROSS APPLY
      dbo.SplitDigits(DatosMensuales.Days_MON) AS DatosDigitales
    OUTER APPLY
      (
        SELECT
          DATEFROMPARTS(DatosMensuales.Year_JAHR, DatosMensuales.Mes, DatosDigitales.Digit) AS Fecha,
          CASE WHEN DatosDigitales.Value = 1 THEN 1 ELSE 0 END AS DiaLaboral
      ) AS DatosFecha
    ORDER BY
      Year_JAHR,
      Fecha;
    

    Ten en cuenta que la función dbo.SplitDigits utilizada en el paso CROSS APPLY deberá ser una función SQL personalizada para dividir los valores de Days_MON en filas separadas según el número de dígitos de cada valor. La implementación exacta de esta función dependerá de la plataforma de la base de datos que se esté utilizando (por ejemplo, SQL Server, MySQL, PostgreSQL, etc.).

Comments are closed.