programing

SQL: 날짜 범위별, 연도별 그룹별로 두 테이블 결합

testmans 2023. 8. 28. 20:53
반응형

SQL: 날짜 범위별, 연도별 그룹별로 두 테이블 결합

두 개의 테이블을 결합하고 싶습니다.

표 1:

작업 몇시간. 고객 시간을
태스크 A 1 클라이언트 A 2023-01-01
태스크 A 2 클라이언트 A 2022-03-04
태스크 A 3 클라이언트 A 2023-01-01
태스크 A 4 클라이언트 A 2022-03-04
태스크 B 5 클라이언트 A 2023-01-01
태스크 B 6 클라이언트 A 2022-03-04
태스크 B 7 클라이언트 A 2023-01-01
태스크 B 8 클라이언트 A 2022-03-04

표 2:

작업 시간 예산 고객 시작 범위 끝 범위
태스크 A 50 클라이언트 A 2023-01-01 2023-12-31
태스크 A 60 클라이언트 A 2022-01-01 2022-12-31
태스크 B 80 클라이언트 A 2023-01-01 2023-12-31
태스크 B 70 클라이언트 A 2022-01-01 2022-12-31

나는 그런 테이블을 원합니다.

작업 시간 예산 고객 시작 범위 끝 범위 소요시간
태스크 A 50 클라이언트 A 2023-01-01 2023-12-31 4
태스크 A 60 클라이언트 A 2022-01-01 2022-12-31 6
태스크 B 80 클라이언트 A 2023-01-01 2023-12-31 12
태스크 B 70 클라이언트 A 2022-01-01 2022-12-31 14

제가 시도한 것:

SELECT
    t2.task as task,
    t2.budget as budget,
        t1.client as client,
    t2.from_date as start_range,
    t2.to_date as end_range,
        sum(t1.hours) AS time_spent,
FROM `Table1` t1
LEFT JOIN 
    `Table2` t2 
    ON t1.task = t2.task
    AND t1.client = t2.client
    AND date(t1.time) BETWEEN t2.start_range and t2.end_range
Group by 
    task, client, start_range, end_range

그러나 이것은 작동하지 않습니다.내가 얻을 수 있는 최선은 그것이 어디에 결합되어 있는가 하는 것이지만, 예를 들어 2022년 전체는 무시됩니다.

어떤 도움이든 정말 감사합니다!

이 쿼리(및 제안된 쿼리)를 사용하면 다음과 같은 결과를 얻을 수 있습니다.

작업 시간 예산 고객 시작 범위 끝 범위 소요시간
태스크 A 50 클라이언트 A 2023-01-01 2023-12-31 4
태스크 A 60 NULL 2022-01-01 2022-12-31 NULL
태스크 B 80 클라이언트 A 2023-01-01 2023-12-31 12
태스크 B 70 NULL 2022-01-01 2022-12-31 NULL

t2.budget에 의해 그룹에 포함되지 않으며 시간 열로 합계해야 합니다.

표 2의 결과를 모두 포함하려면 이 표로 시작한 다음 표 1에 왼쪽으로 조인합니다.여기 테이블 조인에 대한 게시물이 있습니다.

https://www.db-fiddle.com/ 사용하기

스키마(MySQL v5.7)

CREATE TABLE Table1 (
  `Task` VARCHAR(6),
  `Hours` INTEGER,
  `Client` VARCHAR(8),
  `Time` DATE
);

INSERT INTO Table1
  (`Task`, `Hours`, `Client`, `Time`)
VALUES
  ('Task A', '1', 'Client A', '2023-01-01'),
  ('Task A', '2', 'Client A', '2022-03-04'),
  ('Task A', '3', 'Client A', '2023-01-01'),
  ('Task A', '4', 'Client A', '2022-03-04'),
  ('Task B', '5', 'Client A', '2023-01-01'),
  ('Task B', '6', 'Client A', '2022-03-04'),
  ('Task B', '7', 'Client A', '2023-01-01'),
  ('Task B', '8', 'Client A', '2022-03-04');
  
  

CREATE TABLE Table2 (
  `Task` VARCHAR(6),
  `Time Budget` INTEGER,
  `Client` VARCHAR(8),
  `Start Range` DATE,
  `End Range` DATE
);

INSERT INTO Table2
  (`Task`, `Time Budget`, `Client`, `Start Range`, `End Range`)
VALUES
  ('Task A', '50', 'Client A', '2023-01-01', '2023-12-31'),
  ('Task A', '60', 'Client A', '2022-01-01', '2022-12-31'),
  ('Task B', '80', 'Client A', '2023-01-01', '2023-12-31'),
  ('Task B', '70', 'Client A', '2022-01-01', '2022-12-31');

쿼리 #1

SELECT 
t2.`task`,
t2.`Time Budget`,
t2.client,
t2.`Start Range`,
t2.`End Range`,
SUM(t1.hours)

FROM Table2 AS t2
LEFT JOIN Table1 AS t1 
ON t2.Task=t1.task
AND t2.client=t1.client
AND t1.time between t2.`Start Range` AND t2.`End Range`
GROUP BY 1,2,3,4,5;
작업 시간 예산 고객 시작 범위 끝 범위 SUM(t1.시간)
태스크 A 50 클라이언트 A 2023-01-01 2023-12-31 4
태스크 A 60 클라이언트 A 2022-01-01 2022-12-31 6
태스크 B 70 클라이언트 A 2022-01-01 2022-12-31 14
태스크 B 80 클라이언트 A 2023-01-01 2023-12-31 12

DB Fiddle에서 보기

사용해 보십시오.UNION그리고.WHERE2에서 데이터를 가져옵니다.SELECT:

    Select * from 
    (Select a as a1
    UNION
    Select b as b1)
    WHERE b1=a1

언급URL : https://stackoverflow.com/questions/75352169/sql-join-two-tables-by-date-range-and-group-by-year

반응형