1

我正在通过使用左连接来总结 do while 循环的结果,但由于某些未知原因,它没有加入任何表,只是覆盖。什么是我看不见的?

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

这些问题出现在 OTHERWISE 部分(我认为),并且由于另一个未知原因,我的 FoxPro 无法识别 CASE 结构(奖金问题,但优先级较低)。

关于我想要什么的小插图

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

NbofTimes = 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

现在发生的事情是我的最终表格永远不会增长,它只包含最后一次迭代。帮助.....

4

2 回答 2

0

我看到这是您对同一问题的第四次迭代,试图得到答案。正在发生的事情的结构和样本确实很差。您正在显示任意值 1、2、3 ... 80、4、5、6...81 等。您的数据似乎都来自 BS_Case 表。您似乎正在尝试为每个 Depot 创建某种交叉表比较。

现在,您的 BS_Case 表中可能有 200 个条目,包括(例如)5 个唯一的 Depot。仓库“A”可能有 40 个条目,仓库“B”可能有 10 个,仓库“C”有 18 个,其余的分为仓库“D”和“E”。

或 - 每个 DEPOT 在 BS_Case 表中是否有相同数量的条目...例如像麦当劳这样的企业,它有数百家商店,并且每天都向同一个中心点报告每日销售额,所有商店都有相同的记录数。

如果是这样,您似乎正在尝试显示每个 Depot 之间的比较。

因此,例如原始数据记录将类似于...

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

所以,请确认我在这里展示的内容的准确性。

另外,编辑这个问题(不是我的答案,而是你的问题的这个版本),而不是为同一个原始问题重新发布另一个问题。在您的编辑、发布中,显示一些实际数据以及我与您想要的数据有多接近。

我没有看到任何真正的“聚合”,例如 min()、max()、sum() 值,但聚合仅针对添加与每个仓库相对应的另一列。我相信我和其他人可以更好地帮助您更好地阐明您最终想要什么。

于 2012-12-16T14:34:31.023 回答
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 
于 2012-12-16T15:07:18.493 回答