【问题标题】:Select just one row by date with JOIN使用 JOIN 按日期仅选择一行
【发布时间】:2020-05-28 14:12:47
【问题描述】:

我有这些表,我想显示这个 SELECT 结果

Fecha      Mes                  Dia                  Pendiente       Responsable
---------- -------------------- -------------------- --------------- -------------
2019-03-31 Marzo                Domingo              NULL            NULL
2019-04-01 Abril                Lunes                Entrevista 5    Ricardo
2019-04-02 Abril                Martes               Entrevista 15   Ricardo
2019-04-03 Abril                Miercoles            NULL            NULL
2019-04-04 Abril                Jueves               Entrevista 41   Ricardo

这些是表格:

Calendario
fecha      mes         dia
---------- ----------- -----------
2019-03-31 3           7
2019-04-01 4           1
2019-04-02 4           2
2019-04-03 4           3
2019-04-04 4           4
2019-04-05 4           5
2019-04-06 4           6
2019-04-07 4           7
2019-04-08 4           1

Mes
mes         nombre
----------- --------------------
3           Marzo
4           Abril

Dia
dia         nombre
----------- --------------------
1           Lunes
2           Martes
3           Miercoles
4           Jueves
5           Viernes
6           Sabado
7           Domingo

Responsable
responsable nombre
----------- --------------------------------------------------
1           Ricardo
3           Alberto

Pendientes
fecha      responsable pendiente
---------- ----------- ----------------
2019-04-01 1           Entrevista 5
2019-04-04 1           Entrevista 42
2019-04-08 3           Entrevista 97
2019-04-04 1           Entrevista 48
2019-04-02 1           Entrevista 15
2019-04-01 3           Entrevista 8
2019-04-04 3           Entrevista 43
2019-04-04 1           Entrevista 41

我只想要按日期排列的第一行,但我做不到,这是我的 SQL 语法:

SELECT c.fecha as Fecha, m.nombre as Mes, d.nombre as Dia, p.pendiente as Pendiente, r.nombre as Responsable 
FROM pendientes p RIGHT OUTER JOIN calendario c ON p.fecha = c.fecha 
LEFT OUTER JOIN responsable r ON p.responsable = r.responsable 
INNER JOIN mes m ON m.mes = c.mes 
INNER JOIN dia d ON d.dia = c.dia 
WHERE c.fecha between '20190331' and '20190404'

当我运行它时,它会显示包含相同日期的所有值。 我也尝试了 group by 但结果相同

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    试试这个代码作为你的输出。如果您使用的是 SQL Server,则此代码在 Mysql 上完成,然后将“Limit”更改为“TOP”。

     Select fecha,mes,Dia,pendiente,responsable from
        (Select fecha,mes,Dia,min(pendiente) as pendiente, responsable, 
        min(responsible)
        from (
        Select Q.*, E.nombre as Responsable
        from (Select A.fecha, B.nombre as mes, C.nombre as Dia, D.pendiente, 
        D.responsible 
        from Calendario A
        Left join
        (Select * from mes) B
        on A.mes=B.mes
        Left Join
        (Select * from Dia) C
        on A.dia=C.dia
        Left Join
        (Select * from Pendientes) D
        on A.fecha=D.fecha
        order by fecha
        )Q
        Left Join
        (Select * from Responsable) E
        on Q.responsible = E.resonable
        )Z group by fecha order by fecha limit 5
        )T
    

    【讨论】:

      【解决方案2】:

      您可以使用下一个查询:-

      ;with cte as (
        SELECT c.fecha as Fecha, m.nombre as Mes, d.nombre as Dia, p.pendiente as Pendiente, r.nombre as Responsable ,
        rank() over (partition by c.fecha order by p.pendiente) as [r]
      FROM pendientes p RIGHT OUTER JOIN calendario c ON p.fecha = c.fecha 
      LEFT OUTER JOIN responsable r ON p.responsable = r.responsable 
      INNER JOIN mes m ON m.mes = c.mes 
      INNER JOIN dia d ON d.dia = c.dia 
      WHERE c.fecha between '20190331' and '20190404'
      )
       SELECT  Fecha,  Mes,  Dia,  Pendiente,  Responsable 
      from cte
      where [r] = 1
      

      如果你想要一行而不考虑它的排序,你也可以使用Group by 作为下一个:-

      SELECT c.fecha as Fecha, Min(m.nombre) as Mes, Min(d.nombre) as Dia, Min(p.pendiente) as Pendiente, Min(r.nombre) as Responsable 
      FROM pendientes p RIGHT OUTER JOIN calendario c ON p.fecha = c.fecha 
      LEFT OUTER JOIN responsable r ON p.responsable = r.responsable 
      INNER JOIN mes m ON m.mes = c.mes 
      INNER JOIN dia d ON d.dia = c.dia 
      WHERE c.fecha between '20190331' and '20190404'
      group by c.fecha
      

      我想,第一个查询就是你需要的。

      Reference.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-09
        • 2016-11-19
        • 2017-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多