SQL выбор на основе значения столбца - PullRequest
0 голосов
/ 28 февраля 2020

Я обнаружил много подобных случаев, но не, позвольте мне объяснить,

У меня есть таблица, которая выглядит следующим образом:

enter image description here

Значения столбца D являются идентификатором цели, а все остальные столбцы GR C являются целью со своими значениями (я только что добавил фиктивные значения)

Таблица немного сложная, потому что выглядит как сводная стол, я пытаюсь отменить его, но безуспешно. Существует более 200 целевых столбцов, поэтому идея состоит в том, чтобы выбрать только целевые столбцы, которые находятся в столбце D. Я добился того, что с IN, НО это новая цель, тогда я должен изменить ее, чтобы не Dynami c вообще.

Мой вопрос: можно ли выбрать «col», где col - это col в D, как выбрать отличное значение из col D en, а затем выбрать, где в D


+-----+-----+-----+-------+------------+---------+----------+--------+-------+-------+-------------+
|  A  |  B  |  C  |   D   |     Date   |  GRC03  |    GRC06 | GRC08  | GRC21 | GRC25 |    GRC29    |
+-----+-----+-----+-------+------------+---------+----------+--------+-------+-------+-------------+
| XXX | yyy | zzz | GRC03 | 01/01/2020 |     567 |       89 |     65 |     1 |    87 |          23 |
| Xxx | yyy | zzz | GRC06 | 01/01/2020 |     989 |       76 |     43 |     2 |    56 |          24 |
| XXX | yyy | zzz | GRC08 | 02/01/2020 |      67 |       54 |     21 |     3 |    67 |          89 |
| XXX | yyy | zzz | GRC03 | 02/01/2020 |      41 |       38 |     -1 |     4 |    50 | 111,3333333 |
| Xxx | yyy | zzz | GRC06 | 02/01/2020 |    -209 |     20,5 |    -23 |     5 |    40 | 144,3333333 |
| XXX | yyy | zzz | GRC08 | 03/01/2020 |    -459 |        3 |    -45 |     6 |    30 | 177,3333333 |
+-----+-----+-----+-------+------------+---------+----------+--------+-------+-------+-------------+

Результат, который я бы как

+------------+-------+-------------+
|    DATE    |    D  |   RESULTS   |
+------------+-------+-------------+
| 01/01/2020 | GRC03 |         567 |
| 01/01/2020 | GRC06 |          89 |
| 02/01/2020 | GRC08 |          21 |
| 02/01/2020 | GRC21 |           4 |
| 02/01/2020 | GRC25 |          67 |
| 03/01/2020 | GRC29 | 177,3333333 |
+------------+-------+-------------+

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Я думаю, вам нужно выражение case:

select d, date,
       (case when d = 'GRC03' then GRC03
             when d = 'GRC06' then GRC06
             when d = 'GRC08' then GRC08
             when d = 'GRC21' then GRC21
             when d = 'GRC25' then GRC25
             when d = 'GRC29' then GRC29
        end) as results
from t;

Вы также можете отменить поворот, используя apply и фильтр:

select t.d, t.date, v.val
from t cross apply
     (values ('GRC03', GRC03),
             ('GRC06', GRC06),
             ('GRC08', GRC08),
             ('GRC21', GRC21),
             ('GRC25', GRC25),
             ('GRC29', GRC29)
     ) v(col, val)
where v.col = d;
0 голосов
/ 28 февраля 2020

Вы можете попробовать оператор UNPIVOT, как показано в приведенном ниже примере кода.

UNPIVOT AND PIVOT BOL

SELECT Date,D, Results
FROM
(SELECT Date, GRC03, GRC06, GRC08...
FROM YourTable
)
UNPIVOT
(
D FOR Results IN (GRC03, GRC06, GRC08...)
) AS GRCReslts
...