QMF将序列号结果转换为没有PIVOT的自己的列

时间:2013-11-24 02:37:49

标签: sql

对不起,我很新,几乎没有接受过培训。我一直在寻找这几天,也许我只是没有使用正确的条款...

使用QMF for Windows。

我的ADDRESSTABLE表中有3列 - 地址标识符代码,地址行序列号及其对应的地址行。 ADR_CODE,SEQ_NO,ADRS_LINE。

每个地址记录有3到5行,因此有3到5个序列号。因此,当我提取地址标识符代码的查询时,我得到3-5次重复的地址标识符代码。像这样:

SELECT DISTINCT A.ADR_CODE, A.SEQ_NO, A.ADRS_LINE
FROM ADDRESSTABLE A
WHERE (A.ADR_CODE LIKE 'A%')

我得到了:

ADR_CODE    SEQ_NO  ADRS_LINE
AAAA    1   JOHN DOE
AAAA    2   123 HAPPY STREET
AAAA    3   ANYWHERE, NY
AAAA    4   12345
AABB    1   234 MAIN STREET
AABB    2   SOMEWHERE, MN
AABB    3   34567
ACDE    1   MR PINK
ACDE    2   21 RESERVOIR RD
ACDE    3   APT 4
ACDE    4   LOS ANGELES
ACDE    5   90210

我发现如果我这样做:

SELECT DISTINCT A.ADR_CODE, MIN(A.SEQ_NO CONCAT A.ADRS_LINE) AS 
"FIRST ADDRESS LINE", MAX(A.SEQ_NO CONCAT A.ADRS_LINE) AS
"LAST ADDRESS LINE"
FROM ADDRESSTABLE A
WHERE (A.ADR_CODE LIKE 'A%')
ORDER BY A.ADR_CODE ASC
GROUP BY A.ADR_CODE

我明白了:

ADR_CODE    FIRST ADDRESS LINE  LAST ADDRESS LINE
AAAA        1JOHN DOE           412345
AABB        1234 MAIN STREET    334567
ACDE        1MR PINK            590210

我的问题是,如何让其他人进入两行之间? MIN + 1和MAX-1是非法的,MIN(A.SEQ_NO +1 ......和MAX(A.SEQ_NO-1 ...是非法的。我被卡住了,我不想使用PIVOT,因为我想要这一切都是一个更大的查询的一部分。简而言之,我的查询最终应该有大约7000行货运记录 - 每行都有自己的地址 - 而不是7000行*(每条记录3到5个地址行)谢谢你,詹姆斯

1 个答案:

答案 0 :(得分:0)

虽然不完全是PIVOT,但同一个地址表的多重连接是否适合您...

SELECT 
      A.ADR_CODE, 
      A.ADRS_LINE as AdrLine1,
      A2.ADRS_LINE as AdrLine2,
      A3.ADRS_LINE as AdrLine3,
      COALESCE( A4.ADRS_LINE, "" ) as AdrLine4,
      COALESCE( A5.ADRS_LINE, "" ) as AdrLine5
   FROM 
      ADDRESSTABLE A
         JOIN ADDRESSTABLE A2
            ON A.ADR_CODE = A2.ADR_CODE
            AND A2.SEQ_NO = 2
         JOIN ADDRESSTABLE A3
            ON A.ADR_CODE = A3.ADR_CODE
            AND A3.SEQ_NO = 3
         LEFT JOIN ADDRESSTABLE A4
            ON A.ADR_CODE = A4.ADR_CODE
            AND A4.SEQ_NO = 4
         LEFT JOIN ADDRESSTABLE A5
            ON A.ADR_CODE = A5.ADR_CODE
            AND A5.SEQ_NO = 5
   WHERE
          A.ADR_CODE LIKE 'A%'
      AND A.SEQ_NO = 1
   ORDER BY
      A.ADR_CODE

由于查询仅应用于序列#1的地址表,因此您将保留不同的adr_code,因为您没有获得可能的2-5地址行。

现在来了JOIN。我在同一个adr_code键上重新加入相同的地址表,但是对于每一个地址表只有那个特定的地址线...应用LEFT-JOIN为4和5,因为你说1-3总是和4-5只是可能的(还应用coalesce()来防止NULL。)