미친 SQL 질문 : 일종의 크로스를 수행하는 방법은 피벗에 적용됩니까?
-
18-09-2019 - |
문제
고객은 자신의 데이터에 바로 가기를 가지고 있습니다. 레코드의 수량 필드에서. 구문 분석 할 때, 나는 각 수량에 대해 하나의 레코드를 제조해야하며, "식별자"를 7 일 씩 증가시켜야합니다 (숫자는 날짜를 나타 내기 때문입니다.
예 : 4 주 동안 판매되는 단일 제품이며 매주 4 개의 레코드, 1 개의 제품이 필요합니다.
이벤트 번호
분류
주 실행
일부 데이터
2009 11 29 00
1
1
일주일에 실행됩니다
2009 12 06 00
2
1
일주일에 실행됩니다
2009 12 13 00
1
4
4 주간 달린다
2009 12 20 00
2
4
4 주간 달린다
어쨌든이 데이터를보기 (SQL Select)와 함께 다음 데이터로 전환해야합니다 (모두 동일한 테이블에있는 공백이 포함되어 있습니다.
이벤트 번호 + 분류
일부 데이터
2009 11 29 01
일주일 동안 실행됩니다 따라서 일주일에 한 번의 기록.
2009 12 06 02
일주일 동안 실행됩니다
2009 12 13 01
4 주 동안 실행됩니다 날짜가 4 번 증가합니다
2009 12 20 01
4 주 동안 실행됩니다
2009 12 27 01
4 주 동안 실행됩니다
2009 01 03 01
4 주 동안 실행됩니다
2009 12 20 02
4 주 동안 실행됩니다 날짜가 4 번 증가합니다
2009 12 27 02
4 주 동안 실행됩니다
2009 01 03 02
4 주 동안 실행됩니다
2009 01 10 02
4 주 동안 실행됩니다
내 생각은 일종의 Pivot Cross를 적용하는 SQL 코드를 가야합니까?
해결책
저렴한 답변이 있습니다. "사전 렌더링"을 사용합니다. Weeks
쿼리 기반 루프를 생성하는 테이블. 예상 범위의 시나리오를 다루기 위해 충분한 주를 충분히 넣어야합니다.
[Week]
1
2
3
4
그런 다음 쿼리에 참여하십시오 [Weeks Running]
이 표에 불평등을 사용합니다 OriginalTable.WeeksRunning <= Weeks.Week
. 당신은 일주일에 한 줄로 끝납니다.
추가하여 날짜를 추론합니다 Weeks.Week * 7
이벤트 번호에 포함 된 날짜까지.
다른 팁
이것은 데이터베이스 측지가 아닌 애플리케이션 측면에서 더 간단한 일이지만, 샷을 줄 것입니다 ... CTE를 지원하는 데이터베이스가 필요합니다. 이것은 테스트되지 않았습니다.
WITH RECURSIVE expandedTable(eventNumber, classification, index, count, someData)
AS (
SELECT eventNumber, classification, 1, weeksRunning, someData
FROM originalTable
WHERE weeksRunning > 0
UNION ALL
SELECT eventNumber + 7, classification, index + 1, count, someData
FROM expandedTable
WHERE index < count
)
SELECT eventNumber, classification, someData
FROM expandedTable;