Как получить и отсортировать несколько столбцов по их значениям? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь создать таблицу из другой таблицы.Задача состоит в том, чтобы сравнить 3 разных столбца, в которых разные столбцы равны нулю.

  • Будет "сравнивать ItemID1, ItemID2 и ItemID3, брать только те, которые имеют значение в нем, и помещать их в одну строку"
  • Нет, всегда будет самым большим.Если столбец состоит из Да и Нет, будет выбрано Нет
  • Обратите внимание.У одного CustomerID может быть несколько разных ItemID

Пример 1

+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 |   Value    |
+------------+---------+---------+---------+------------+
|          1 | abc     | xyz     | cde     | Yes        |
|          1 | abc     | null    | cde     | No         |
|          1 | null    | xyz     | cde     | No         |
|          1 | abc     | xyz     | cde     | No         |
|          1 | iop     | tyu     | ghj     | Yes        |
|          1 | iop     | null    | ghj     | Yes        |
|          1 | iop     | tyu     | ghj     | Yes        |
|          1 | null    | tyu     | ghj     | Yes        |
+------------+---------+---------+---------+------------+

Ожидаемый результат будет

+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
|          1 | abc     | xyz     | cde     | No    |
|          1 | iop     | tyu     | ghj     | Yes   |
+------------+---------+---------+---------+-------+

Пример 2

+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 |   Value    |
+------------+---------+---------+---------+------------+
|          1 | qwe     | null    | asd     | No         |
|          1 | qwe     | null    | asd     | Yes        |
|          1 | null    | null    | asd     | Yes        |
|          1 | qwe     | null    | asd     | Yes        |
+------------+---------+---------+---------+------------+

Ожидаемый результат будет

+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
|          1 | qwe     | null    | asd     | No    |
+------------+---------+---------+---------+-------+

Пример 3

+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 |   Value    |
+------------+---------+---------+---------+------------+
|          1 | fgh     | null    | zxc     | Yes        |
|          1 | fgh     | xyv     | zxc     | Yes        |
|          1 | null    | null    | zxc     | Yes        |
|          1 | fgh     | null    | zxc     | Yes        |
+------------+---------+---------+---------+------------+

Ожидаемый результат будет

+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
|          1 | fgh     | xyv     | zxc     | Yes   |
+------------+---------+---------+---------+-------+

То, что я пробовал.

Iпопробовал в, коды ниже.но получать неправильные результаты.Кажется, что он берет только первое, основанное на ItemID1

Пробный пример

+------------+---------+---------+---------+------------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 |   Value    |
+------------+---------+---------+---------+------------+
|          1 | fgh     | null    | zxc     | Yes        |
|          1 | fgh     | xyv     | zxc     | No         |
|          1 | null    | null    | zxc     | Yes        |
|          1 | fgh     | null    | zxc     | Yes        |
|          1 | iop     | tyu     | ghj     | Yes        |
|          1 | iop     | null    | ghj     | Yes        |
|          1 | iop     | tyu     | ghj     | Yes        |
|          1 | null    | tyu     | ghj     | Yes        |
|          2 | abc     | xyz     | cde     | Yes        |
|          2 | abc     | null    | cde     | No         |
|          2 | null    | xyz     | cde     | No         |
|          2 | abc     | xyz     | cde     | No         |
+------------+---------+---------+---------+------------+

Результат Возврат

+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
|          1 | fgh     | null    | zxc     | Yes   |
|          1 | iop     | tyu     | ghj     | Yes   |
|          2 | abc     | xyz     | cde     | Yes   |
+------------+---------+---------+---------+-------+

Ожидаемый результат будет

+------------+---------+---------+---------+-------+
| CustomerID | ItemID1 | ItemID2 | ItemID3 | Value |
+------------+---------+---------+---------+-------+
|          1 | fgh     | xyz     | zxc     | No    |
|          1 | iop     | tyu     | ghj     | Yes   |
|          2 | abc     | xyz     | cde     | No    |
+------------+---------+---------+---------+-------+

Код, который я пробовал.

INSERT INTO NEW_TABLE
    (CustomerID,
     ItemID1,
     ItemID2,
     ItemID3,
     Value)
SELECT
     CustomerID,
     ItemID1,
     ItemID2,
     ItemID3,
     Value
FROM (SELECT
     CustomerID,
     ItemID1,
     ItemID2,
     ItemID3,
     Value,
     row_number() OVER(PARTITION BY ItemID1 ORDER BY ETA DESC)rn
     FROM ETA_TABLE)
WHERE rn = 1

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

Я думаю, что вы хотите:

select t.*,
       (select min(value)
        from t t2
        where t2.CustomerID = t.CustomerID and
              (t2.ItemID1 = t.ItemID1 or
               t2.ItemID2 = t.ItemID2 or
               t2.ItemID3 = t.ItemID3
              )
       ) as valu
from (select distinct CustomerID, ItemID1, ItemID2, ItemID3
      from t
      where ItemID1 is not null and
            ItemID2 is not null and
            ItemID3 is not null
     ) t;

MIN() имеет приятное свойство, которое будет возвращать 'No', если любое из значений 'No'.

Примечание: ВашеВ образцах данных есть непересекающиеся наборы для элементов - перекрытий нет.Если это присутствует в ваших реальных данных, и это не решает вашу проблему, вам следует задать другой вопрос.

0 голосов
/ 25 сентября 2019

Я думаю, что вы хотите:

SELECT
    CustomerID,
    MAX(ItemID1) AS ItemID1,
    MAX(ItemID2) AS ItemID2,
    MAX(ItemID3) AS ItemID3,
    CASE WHEN SUM(CASE WHEN Value = 'No' THEN 1 END) > 0 THEN 'No' ELSE 'Yes' END AS Value
FROM ETA_TABLE
GROUP BY
    CustomerID;
...