Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Вывод всех дней и часов


Автор: NightHarpy 18.7.2020, 15:20
есть две таблицы:

| id | name |
-------------
| 42 | John |

| 43 | Jane |

и вторая:

| id | employee_id | hours | date |
----------------------------------------
| 1 | 42 | 4.5 | 1/12/2020 |

| 2 | 42 | 7.0 | 2/12/2020 |

| 3 | 43 | 5.5 | 1/12/2020 |

| 4 | 43 | 6.0 | 2/12/2020 |

Нужно вывести все 7 дней недели, в таком виде:

| Monday | John (4.45 hours), Jane (7.54 hours), Alex (3.5 hours) |

выводятся только три человека с самыми большими часами работы в конкретный день.
Заранее спасибо.

Автор: Oldshelf 20.7.2020, 12:28
Код

SELECT *,DATE_FORMAT(STR_TO_DATE(`date`,'%d/%m/%Y'), '%a') AS `weekday` FROM `week`
LEFT JOIN `employee` ON `week`.`employee_id`=`employee`.`id`
WHERE UNIX_TIMESTAMP(STR_TO_DATE(`date`,'%d/%m/%Y'))>=UNIX_TIMESTAMP(STR_TO_DATE('1/12/2020','%d/%m/%Y'))
&& UNIX_TIMESTAMP(STR_TO_DATE(`date`,'%d/%m/%Y'))<=UNIX_TIMESTAMP(STR_TO_DATE('7/12/2020','%d/%m/%Y'))

Автор: Агрох 18.9.2020, 10:02
Мне было скучно и я решил занялся лёгким некропостингом...

Код

WITH recursive R0 AS (
  SELECT 42 AS ID, 'John' AS Name FROM RDB$DATABASE
  UNION ALL
  SELECT 43 AS ID, 'Jane' AS Name FROM RDB$DATABASE
  UNION ALL
  SELECT 44 AS ID, 'Jak' AS Name FROM RDB$DATABASE
  UNION ALL
  SELECT 45 AS ID, 'Jun' AS Name FROM RDB$DATABASE
), R1 AS (
  SELECT 1 AS ID, 42 AS R0_ID, CAST(4.5 AS DECIMAL(2,1)) AS Hours, CAST('12/01/2020' AS DATE) AS dt FROM RDB$DATABASE
  UNION all
  SELECT 2 AS ID, 42 AS R0_ID, CAST(7.0 AS DECIMAL(2,1)) AS Hours, CAST('12/02/2020' AS DATE) AS dt FROM RDB$DATABASE
  UNION all
  SELECT 3 AS ID, 43 AS R0_ID, CAST(5.5 AS DECIMAL(2,1)) AS Hours, CAST('12/01/2020' AS DATE) AS dt FROM RDB$DATABASE
  UNION all
  SELECT 4 AS ID, 43 AS R0_ID, CAST(6.5 AS DECIMAL(2,1)) AS Hours, CAST('12/02/2020' AS DATE) AS dt FROM RDB$DATABASE
  UNION all
  SELECT 5 AS ID, 44 AS R0_ID, CAST(4.3 AS DECIMAL(2,1)) AS Hours, CAST('12/01/2020' AS DATE) AS dt FROM RDB$DATABASE
  UNION all
  SELECT 6 AS ID, 45 AS R0_ID, CAST(3.5 AS DECIMAL(2,1)) AS Hours, CAST('12/01/2020' AS DATE) AS dt FROM RDB$DATABASE
), R2 AS (
SELECT
  ROW_NUMBER() OVER(PARTITION BY R1.dt ORDER BY R1.Hours DESC) AS RN,
  R0.Name,
  R1.Hours,
  R1.dt
FROM R0
  INNER JOIN R1
    ON R1.R0_ID = R0.ID
), R3 AS (
select
  ROW_NUMBER() OVER(PARTITION BY EXTRACT(WEEKDAY FROM dt) ORDER BY Hours DESC) AS RN,
  MAX(RN) OVER(PARTITION BY EXTRACT(WEEKDAY FROM dt)) AS RN_M,
  EXTRACT(WEEKDAY FROM dt) AS WD,
  CAST(Name || '(' || Hours || ' hours)' AS VARCHAR(1000)) AS rs
FROM R2
WHERE RN < 4
), R4 AS (
  SELECT WD, rs, RN, RN_M
  FROM R3
  WHERE RN = 1

  UNION ALL

  SELECT R4.WD, R4.rs || ', ' || R3.rs AS rs, R3.RN, R4.RN_M
  FROM R4
    INNER join R3
      ON R3.WD = R4.WD
        and R4.RN + 1 = R3.RN
)
SELECT
  WD,
  RS
FROM R4
WHERE RN = RN_M

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)