2012-12-16 2 views
1

왼쪽 가입을 사용하여 do while 루프의 결과를 요약하고 있지만 일부 알 수없는 이유로 모든 테이블에 가입하지 않고 덮어 씁니다. 내가 보지 못하는 것은 무엇입니까?FoxPro 9.0 LEFT JOIN 덮어 쓰기입니다.

DO WHILE counter < NbContracts 
    SELECT depot_nr as depot_nr; 
    WHERE rownum = counter FROM test3 
    test33(depot_nr, counter) 
    counter = counter + 1 
ENDDO 
CLOSE TABLES 

PROCEDURE test33(depot_nr_in, NbofTimes) 
USE bs_case alias bs 
SELECT jaar as jaar,; 
     Psres4pcgb as &depot_nr_in;   
    WHERE Depot_nr = depot_nr_in FROM bs 
    COPY TO toJoin.dbf 

DO CASE 
    CASE NbofTimes = 1 
     SELECT * FROM toJoin.dbf 
     COPY TO joining.dbf 
    CASE NbofTimes = NbContracts 
     SELECT * FROM bsP.tmp as one LEFT JOIN joining.dbf as aggregated; 
     ON (one.depot_nr = aggregated.depot_nr) into table final.dbf 
     CLOSE TABLES 
     ENDPROC 
    OTHERWISE 
     SELECT &depot_nr_in FROM toJoin.dbf as a LEFT JOIN joining.dbf as b; 
      ON a.jaar = b.jaar INTO TABLE final.dbf 
     CLOSE TABLES 
     USE final.dbf 
     COPY TO joining.dbf 
ENDCASE 

CLOSE TABLES 
CLOSE DATABASES 
ENDPROC 

이슈는 달리 섹션 (내가 생각하는) 다른 알 수없는 이유로 내 FoxPro에이 CASE 구조 recogninzing되지 나타납니다 (보너스 질문을하지만, 우선 해제 이하).

내가

test3.dbf 
=================================== 
22 
31 
32 
23 

NbofTimes = 1

final.dbf 
=================================== 
year  22 
----------------------------------- 
    1  val1 
    2  val2 
    3  val3 
... ... 
    80 val80 

NbofTimes = 2

final.dbf 
=================================== 
year  22  31 
----------------------------------- 
    1  val1 val4 
    2  val2 val5 
    3  val3 val6 
...  ...  ... 
80  val80 val81 

NbofTimes = 3

final.dbf 
=================================== 
year 22  31  32 
----------------------------------- 
    1  val1 val4  val7 
    2  val2 val5  val8 
    3  val3 val6  val9 
...  ...  ... ... 
    80  val80 val81  val82 
을 원하는에 작은 그림 4

final.dbf 
=================================== 
year 22  31  32  23 
----------------------------------- 
    1 val1 val4  val7  val10 
    2 val2 val5  val8  val11 
    3 val3 val6  val9  val12 
... ... ...  ...  ... 
    80 val80 val81  val82 val83 

내 마지막 표는 결코 그냥 마지막 반복을 포함 성장되지 않도록 무엇 지금 일어나고있는 것은

NbofTimes =. 도움 .....

답변

0

나는이 질문에 대한 네 번째 반복문을 보았습니다. 진행중인 작업은 실제로 제대로 구조화되지 않고 샘플링됩니다. 임의의 값 1, 2, 3 ... 80, 4, 5, 6 ... 81 등을 표시하고 있습니다. 데이터는 모두 BS_Case 테이블에서 비롯된 것 같습니다. 각 Depot 당 일종의 크로스 탭 비교를 만들려고하는 것으로 보입니다.

이제는 (예를 들어) 5 개의 고유 한 저장소로 구성된 BS_Case 테이블에 200 개의 항목이있을 수 있습니다. 디포 "A"는 40 개의 항목을 가질 수 있고, 디포 "B"는 10을 가질 수 있고, 디포 "C"는 18을 가지고 나머지는 디포 "D"와 "E"사이에 나뉘어 질 수 있습니다.

또는 모든 DEPOT은 BS_Case 테이블의 항목 수가 동일하지 않습니다 ... 수백 개의 상점을 보유하고 있으며 매일 매일 같은 중앙 지점에 일일 판매를보고하는 McDonalds와 같은 비즈니스의 경우 모든 상점에는 동일한 레코드 수가 있습니다.

그렇다면 각 저장소의 비교를 표시하는 것처럼 보입니다.

따라서 예는 원시 데이터 기록

BS_CASE 
Record # Depot_NR Psres4pcgb 
1   DepotA AValue1 
2   DepotB BValue1 
3   DepotC CValue1 
4   DepotA AValue2 test 
5   DepotB BValue2 another 
6   DepotC CValue2 confirm 

당신의 외부 루프 당 대표 DISTINCT 종점의 귀하의 목록에

JustDepotList 
Record # Depot_NR 
1   DepotA 
2   DepotB 
3   DepotC 

될 것입니다 그리고 당신은 무엇을 기대하고있다 ... 뭔가 같은 것 얻을 수있는 것은

Final 
Record DepotA  DepotB   DepotC 
1  AValue1  BValue1   CValue1 
2  AValue2 test BValue2 another CValue2 confirm 

과 비슷합니다. 따라서 정확도를 확인하십시오. 여기에 esenting.

또한 동일한 원래 질문에 대해 다른 게시물을 다시 게시하는 대신 본 질문 (내 대답은 아니지만이 버전의 질문)을 개정판으로 편집하십시오. 귀하의 편집, 게시, 일부 실제 데이터 및 내가 원하는 것에 얼마나 가까운지 보여주십시오.

min(), max(), sum() 값과 같은 실제 "집계"는 표시되지 않지만 집계는 각 저장소에 해당하는 다른 열 추가와 관련하여 만 표시됩니다. 나는 나 자신과 다른 사람들이 당신이 궁극적으로 원하는 것을 더 잘 설명 할 수 있다고 확신합니다.

+0

안녕하세요 예 내 응집 추가 열 및 I 등 분(), MAX() 합계()로서 열이 아닌 값과 관련되어) = 일하고 코드의 다른 발췌 문장을 해결할 수 있었고, 이제는 내가하는 일이 왜 작동하지 않는지 이해하기 위해 고심하고있다. 미안 내 설명이 충분히 명확하지 않은 경우, 나는 이것에 많은 시간을 할애하고 명백한 아닌지 보지 못합니다. – Orongo

+0

@orongo,이 게시를 편집하고 모든 코드를 표시 할 수 있습니까? 일부 부분이 빠져 있고 전체 사이클 수에 대한 시작/변수가 처리되지 않는 경우가 있습니다. 또한 "jaar"값 등의 일부 샘플을 사용하면 새로운 솔루션을 더 잘 활용하고 찾고있는 것을 얻는 방법을 간소화 할 수 있습니다. – DRapp

+0

@Orongo, 실제 저장소를보고, jaar, 데이터의 자연스러운 표시 (찾아보기)로 Psres4pcgb 값이 실제로 도움이됩니다. – DRapp

0

OTHERWISE 문 아래에서이 스 니펫을 사용하여 쿼리를 해결할 수있었습니다. 그것은 해킹 약간이지만 그것은

SELECT * FROM toJoin.dbf LEFT JOIN joining.dbf; 
     ON toJoin.jaar = joining.jaar INTO TABLE finaltmp.tmp 
    CLOSE TABLES 
    USE finaltmp.tmp 
    ALTER TABLE finaltmp.tmp; 
     DROP COLUMN jaar_a; 
     RENAME COLUMN jaar_b TO jaar 
    COPY TO final.dbf 
    USE final.dbf 
    COPY TO joining.dbf