2014-09-05 3 views
0

У меня есть тип погоды таблица:комбинация групп и подсчитывать их

BaseVar | BaseDate | BaseAttr1 | BaseAttr2 | DependVar | DependDate | DependAttr1 | DependAttr2 | 

VarA  01/01  -1   -1  VarA  01/01   -1   -1  
VarA  01/01  -1   -1  VarB  01/01   1   1 
VarA  01/01  -1   -1  VarC  01/01   -1   -1 
VarB  01/01  1   1  VarA  01/01   -1   -1  
VarB  01/01  1   1  VarB  01/01   1   1 
VarB  01/01  1   1  VarC  01/01   -1   -1 
VarC  01/01  -1   -1  VarA  01/01   -1   -1  
VarC  01/01  -1   -1  VarB  01/01   1   1 
VarC  01/01  -1   -1  VarC  01/01   -1   -1 

VarA  01/02  -1   1  VarA  01/02  -1   1  
VarA  01/02  -1   1  VarB  01/02  -1   -1 
VarA  01/02  -1   1  VarC  01/02  -1   -1 
VarB  01/02  -1   -1  VarA  01/02  -1   1  
VarB  01/02  -1   -1  VarB  01/02  -1   -1 
VarB  01/02  -1   -1  VarC  01/02  -1   -1 
VarC  01/02  -1   -1  VarA  01/02  -1   1  
VarC  01/02  -1   -1  VarB  01/02  -1   -1 
VarC  01/02  -1   -1  VarC  01/02  -1   -1 

. 
. 
. 
. 
. 
All the way to 12/30 

Существует тип отношение «1 ко многим», где BaseVar имеет много DependVar годов. Моя цель состоит в том, когда возникает комбинация «BaseVar + WhatBaseAttr + VaseValue», подсчитывайте каждую из следующих комбинаций «DependAttr1 + WhichDependAttr + DependantValue». В конце подсчитайте их все, чтобы я мог видеть, когда происходит эта комбинация ... эти комбинации также происходят много раз. Таким образом, каждый день все переменные (VarA, VarB, VarC) получают одно значение в каждом столбце Attr1 и Attr2 (значение может быть 1 или -1). Я дал частичный результат (так как слишком много комбинаций), чтобы лучше видеть, чего я пытаюсь выполнить. Я хочу преобразовать свои данные из первой таблицы в таблицу ниже. Я пробовал разные группы, но не могу заставить его работать.

BaseVar | WhichBaseAttr| BaseValue| BaseAttrCount() | DependVar | WhichDependAttr | DependantValue| DependAttrCount()| 
VarA  BaseAttr1  1  0    VarA   DependAttr1   1    0 
VarA  BaseAttr1  1  0    VarA   DependAttr1   -1    0 
VarA  BaseAttr1  -1  2    VarA   DependAttr1   1    0 
VarA  BaseAttr1  -1  2    VarA   DependAttr1   -1    2 

VarA  BaseAttr2  1  1    VarA   DependAttr1   1    1 
VarA  BaseAttr2  1  1    VarA   DependAttr1   -1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr1   1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr1   -1    1 

VarA  BaseAttr2  1  1    VarA   DependAttr2   1    1 
VarA  BaseAttr2  1  1    VarA   DependAttr2   -1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr2   1    0 
VarA  BaseAttr2  -1  1    VarA   DependAttr2   -1    1 

VarA  BaseAttr1  1  0    VarA   DependAttr2   1    0 
VarA  BaseAttr1  1  0    VarA   DependAttr2   -1    0 
VarA  BaseAttr1  -1  2    VarA   DependAttr2   1    1 
VarA  BaseAttr1  -1  2    VarA   DependAttr2   -1    1 

(Next seqeuence would be :) 

VarA             VarB 

After all those are done: 

VarA             VarC 

Then: 

VarB             VarA 

and so on until it would reach: 

VarC             VarC 

По существу, для каждой комбинации baseVar + baseAttr + baseVal, я пытаюсь подсчитать, сколько раз каждая другая комбинация происходит. Так, например, (не относящийся к моей таблице, только отдельный пример): VarB + Attr2 + значение = -1 произошло 29 раз, а когда это произошло 29 раз, значение VarA + Attr1 + значение = 1 произошло 15 раз, значение VarA + Attr1 + = -1 произошло 6 раз и так далее. Это повторялось бы до тех пор, пока я не пройду через все комбинации.

+0

Это не для меня ясно из вопроса, почему 'порядок by' не хорошо для вас ... – Betlista

+0

Я не уверен, что заказ на бы сам по себе в этой ситуации? Мне нужно получить количество случаев и соответствующим образом группировать их. – user2924127

+0

Я не понял, как вычисляются 'BaseAttrCount()' и 'DependAttrCount()'. Также кажется, что может быть «BaseAttr3», например (из вашего описания), но в SQL структура таблицы не меняется ... – Betlista

ответ

0

Хотя я не полностью уверен, что следую вашим объяснениям, я думаю, что следующее может удовлетворить ваши требования. Он основан на построении декартова произведения всех отдельных базовых переменных * возможных значений снова со всеми отдельными зависимыми переменными * возможных значений. Из ваших выборочных данных получается 144 различных комбинаций.

Как только это существует, вы можете присоединиться к исходным данным (дважды из-за ненормированных полей), сопоставляя базовые переменные, зависимые переменные и как базовые, так и зависимые значения. Оттуда мы рассчитываем использовать выражение case.

Обратите внимание, что ваши данные образца имеют 18 строк с 2 парами значений (18 * 2), поэтому ожидается 36 значений для BaseAttrCount и DependAttrCount.

select 
     bvar.BaseVar 
    , bvar.WhichBaseAttr 
    , bval.BaseValue 
    , count(case when bvar.WhichBaseAttr = 'BaseAttr1' then bd1.BaseAttr1 
       when bvar.WhichBaseAttr = 'BaseAttr2' then bd1.BaseAttr2 
      end) 
    + count(case when bvar.WhichBaseAttr = 'BaseAttr1' then bd2.BaseAttr1 
       when bvar.WhichBaseAttr = 'BaseAttr2' then bd2.BaseAttr2 
      end) as BaseAttrCount 
    , dvar.DependVar 
    , dvar.WhichDependAttr 
    , dval.DependantValue 
    , count(case when dvar.WhichDependAttr = 'DependAttr1' then bd1.DependAttr1 
       when dvar.WhichDependAttr = 'DependAttr2' then bd1.DependAttr2 
      end) 
    + count(case when dvar.WhichDependAttr = 'DependAttr1' then bd2.DependAttr1 
       when dvar.WhichDependAttr = 'DependAttr2' then bd2.DependAttr2 
      end) as DependAttrCount 
from (
     select distinct 
      BaseVar 
      , 'BaseAttr1' as WhichBaseAttr 
     from Weather 
     UNION ALL 
     select distinct 
      BaseVar 
      , 'BaseAttr2' 
     from Weather 
    ) as bvar 
cross join (
      select -1 as BaseValue UNION ALL select 1 
      ) as bval 
cross join(
      select distinct 
       DependVar 
       , 'DependAttr1' as WhichDependAttr 
      from Weather 
      UNION ALL 
      select distinct 
       DependVar 
       , 'DependAttr2' 
      from Weather 
     ) as dvar 
cross join (
      select -1 as DependantValue UNION ALL select 1 
      ) as dval 
left join weather as bd1 on bvar.basevar   = bd1.basevar 
         and bvar.WhichBaseAttr = 'BaseAttr1' 
         and bval.BaseValue  = bd1.BaseAttr1 
         and dvar.DependVar  = bd1.DependVar 
         and dvar.WhichDependAttr = 'DependAttr1' 
         and dval.DependantValue = bd1.DependAttr1 
left join weather as bd2 on bvar.basevar   = bd2.basevar 
         and bvar.WhichBaseAttr = 'BaseAttr2' 
         and bval.BaseValue  = bd2.BaseAttr2 
         and dvar.DependVar  = bd2.DependVar 
         and dvar.WhichDependAttr = 'DependAttr2' 
         and dval.DependantValue = bd2.DependAttr2 
group by 
     bvar.BaseVar 
    , bvar.WhichBaseAttr 
    , bval.BaseValue 
    , dvar.DependVar 
    , dvar.WhichDependAttr 
    , dval.DependantValue 
order by 
     bvar.BaseVar 
    , bvar.WhichBaseAttr 
    , bval.BaseValue 
    , dvar.DependVar 
    , dvar.WhichDependAttr 
    , dval.DependantValue 
; 

See this SQLfiddle demo