Сопоставить данные итеративно с SQL? - PullRequest
0 голосов
/ 24 ноября 2011

Я борюсь с запросом, и я застрял на пару дней, не зная, возможно ли это.

У меня есть результат, подобный следующему:

ID  ;CASE;LINE;QTY;ORDER;CODE
1446;2725;   1;  1;33333;A
1446;2724;   1;  1;33333;A
0430;2545;   1;  2;44444;B
0430;2547;   1;  2;44444;B
9628;2710;   1;  1;55555;C
9628;2708;   1;  1;55555;C
9628;2708;   2;  1;66666;
9628;2710;   2;  1;66666;
9628;2710;   3;  1;55555;C
9628;2708;   3;  1;55555;C

Из этих строк я хочу получить:

1446;2725;   1;  1;33333;A
1446;2724;   1;  1;33333;A
0430;2545;   1;  2;44444;B
0430;2547;   1;  2;44444;B
9628;2710;   1;  1;55555;C
9628;2708;   3;  1;55555;C

Или:

1446;2725;   1;  1;33333;A
1446;2724;   1;  1;33333;A
0430;2545;   1;  2;44444;B
0430;2547;   1;  2;44444;B
9628;2708;   1;  1;55555;C
9628;2710;   3;  1;55555;C

, т. Е. Я хочу отфильтровать те, которые имеют CODE null (я могу это сделать), и хочу сопоставить дела со строками (вот где у меня проблемы).

Дело в том, что я не имею никакого отношения к дискриминации. Неважно, что CASE 2708 соответствует LINE 3 или 1, но CASE 2710 необходимо сопоставить с другой LINE.

Это было бы очень легко на языке, таком как Java или C ++, но, поскольку я не могу объявить переменные или списки, я не знаю, как «пометить» LINE как выбранную.

Я тоже не могу использовать хранимые процедуры. Я начинаю думать, что это невозможно сделать, но, возможно, кто-то может пролить немного света.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Редактировать

Первая версия не затрагивала вопрос.

order и case являются зарезервированными словами в PostgreSQL . Не используйте их в качестве идентификаторов! Я переименовал в ord и cas в моем примере.

WITH x AS (
    SELECT id, qty, ord, code
          ,min(line) AS line1
          ,max(line) AS line2
          ,min(cas)  AS cas1
          ,max(cas)  AS cas2
    FROM   tbl
    WHERE  code IS NOT NULL
    GROUP  BY 1,2,3,4
    )
SELECT id, cas1, line2, qty, ord, code
FROM   x
UNION  ALL  -- only add more rows, where 
SELECT id, cas2, line1, qty, ord, code
FROM   x
WHERE  cas1 <> cas2 AND line1 <> line2
ORDER  BY code, 1,2,3,4,5;

Это предполагает максимум два разных line или cas на code, и что другие столбцы не добавляют больше вариантов. Это дает результат, продемонстрированный в вопросе.

1 голос
/ 24 ноября 2011

Следующие выходные данные будут такими же, как указано, хотя не ясно, будут ли ваши данные всегда генерировать пары значений по идентификатору:

SELECT ID,
       CASE M.AGG WHEN "MIN" THEN MIN(M."CASE")
            ELSE MAX(M."CASE")
       END AS "CASE",
       CASE M.AGG WHEN "MIN" THEN MIN(M.LINE)
            ELSE MAX(M.LINE)
       END AS LINE,
       CASE M.AGG WHEN "MIN" THEN MIN(M.QTY)
            ELSE MAX(M.QTY)
       END AS QTY,
       CASE M.AGG WHEN "MIN" THEN MIN(M."ORDER")
            ELSE MAX(M."ORDER")
       END AS "ORDER",
       CASE M.AGG WHEN "MIN" THEN MIN(M."CODE")
            ELSE MAX(M."CODE")
       END AS "CODE"
FROM MYTABLE M
CROSS JOIN (SELECT "MIN" AGG UNION SELECT "MAX") A
WHERE M.CODE IS NOT NULL
GROUP BY M.ID, A.AGG
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...