2015-09-06 3 views
0

Так что я столкнулся с проблемой при работе с некоторым SQL-кодом. У меня есть таблица данных, которая выглядит примерно так:SQL - вычисление значения ячейки на основе других значений ячейки

ID TimeID IndicatorID  Score 
1  111   45    20 
1  111   46    14 
1  111   47    83 
1  111   48    91 
1  112   45    20 
1  112   46    14 
1  112   47    83 
1  112   48    91 
2  111   45    25 
2  111   46    12 
2  111   47    70 
2  111   48    82 
2  112   45    25 
2  112   46    12 
2  112   47    70 
2  112   48    82 

Я хочу, чтобы добавить новые строки, содержащие значения индикатора 240 и 241, где оценка по показателю 240 оценка для индикатора 45/баллов для индикатора 46 и Аналогично, оценка для индикатора 241 - это показатель для индикатора 47/score для индикатора 48. Это необходимо сделать для каждого идентификатора времени для каждого идентификатора.

Полный стол огромен, поскольку количество идентификаторов, идентификаторов времени для каждого идентификатора и индикаторов индикатора для каждого TimeID велико.

ответ

0

Предполагая, что ваши требования, как указано, и все IndicatorID значения жестко закодированы это может быть сделано с некоторыми просто подзапросов и простой INSERT заявление:

insert into your_table 
with yt as (
    select * from your_table where IndicatorID in (45,46,47,48) 
    ) 
    , yt45 as (select * from yt where IndicatorID = 45) 
    , yt46 as (select * from yt where IndicatorID = 46) 
    , yt47 as (select * from yt where IndicatorID = 47) 
    , yt48 as (select * from yt where IndicatorID = 48) 
select yt45.id 
     , yt45.timeID 
     , 240 as IndicatorID 
     , yt45.score/yt46.score as score 
from yt45 
    join yt46 
    on yt45.id = yt46.id 
     and yt45.timeID = yt46.timeID 
union all 
select yt47.id 
     , yt47.timeID 
     , 240 as IndicatorID 
     , yt47.score/yt48.score as score 
from yt47 
    join yt48 
    on yt47.id = yt48.id 
     and yt47.timeID = yt48.timeID 
/
0

Это может быть легко решена с помощью MODEL clause ,

SQL Fiddle

select id, timeid, indicatorid, score 
from myt 
model return updated rows 
partition by (id, timeid) 
dimension by (indicatorid) 
measures(score) 
rules(
    score[240] = score[45]/score[46], 
    score[241] = score[47]/score[48] 
); 

Results:

| ID | TIMEID | INDICATORID |    SCORE | 
|----|--------|-------------|--------------------| 
| 2 | 111 |   241 | 0.8536585365853658 | 
| 2 | 111 |   240 | 2.0833333333333335 | 
| 1 | 112 |   241 | 0.9120879120879121 | 
| 1 | 112 |   240 | 1.4285714285714286 | 
| 2 | 112 |   241 | 0.8536585365853658 | 
| 2 | 112 |   240 | 2.0833333333333335 | 
| 1 | 111 |   241 | 0.9120879120879121 | 
| 1 | 111 |   240 | 1.4285714285714286 | 


insert into myt 
select id, timeid, indicatorid, score 
from myt 
model return updated rows 
partition by (id, timeid) 
dimension by (indicatorid) 
measures(score) 
rules(
    score[240] = score[45]/score[46], 
    score[241] = score[47]/score[48] 
); 

Results:

select id, timeid, indicatorid, score 
from myt 

Results:

| ID | TIMEID | INDICATORID |    SCORE | 
|----|--------|-------------|--------------------| 
| 1 | 111 |   45 |     20 | 
| 1 | 111 |   46 |     14 | 
| 1 | 111 |   47 |     83 | 
| 1 | 111 |   48 |     91 | 
| 1 | 111 |   240 | 1.4285714285714286 | 
| 1 | 111 |   241 | 0.9120879120879121 | 
| 1 | 112 |   45 |     20 | 
| 1 | 112 |   46 |     14 | 
| 1 | 112 |   47 |     83 | 
| 1 | 112 |   48 |     91 | 
| 1 | 112 |   240 | 1.4285714285714286 | 
| 1 | 112 |   241 | 0.9120879120879121 | 
| 2 | 111 |   45 |     25 | 
| 2 | 111 |   46 |     12 | 
| 2 | 111 |   47 |     70 | 
| 2 | 111 |   48 |     82 | 
| 2 | 111 |   240 | 2.0833333333333335 | 
| 2 | 111 |   241 | 0.8536585365853658 | 
| 2 | 112 |   45 |     25 | 
| 2 | 112 |   46 |     12 | 
| 2 | 112 |   47 |     70 | 
| 2 | 112 |   48 |     82 | 
| 2 | 112 |   240 | 2.0833333333333335 | 
| 2 | 112 |   241 | 0.8536585365853658 | 
+0

Ничто не может быть «легко решить», используя типовую статью :) – APC

Смежные вопросы