반응형
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 |
사용해 보십시오.UNION
그리고.WHERE
2에서 데이터를 가져옵니다.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
반응형
'programing' 카테고리의 다른 글
16진수를 RGBA로 변환 (0) | 2023.08.28 |
---|---|
오라클에서 동일한 데이터베이스에 전체 스키마의 복사본을 만드는 방법 (0) | 2023.08.28 |
iOS 13용 SF 심볼에 가중치를 설정하려면 어떻게 해야 합니까? (0) | 2023.08.28 |
스팬의 CSS 고정 너비 (0) | 2023.08.28 |
nbsp가 CSS 콘텐츠 태그에서 작동하지 않습니다. (0) | 2023.08.28 |