2015-04-10 2 views
1

У меня есть опрос (многокритериального анализа решения), которая сбрасывает результаты в следующей таблице с именем CriteriaWeighting:перекрестный запрос в Access и/или SQL для выполнения таблицы комбинации

User | Criteria1 | Criteria2 | ... | CriterX 
-------------------------------------------- 
Name1| n1w1 | n1w2 | ... | n1wX | 
Name2| n2w1 | n2w2 | ... | n2wX | 
... 

Я хотел бы создать новая таблица с именем WeightinStats со следующей структурой:

Criteria | Average | StDev | Var | 
----------------------------------------- 
Criteria1 | AVG(c1) | StD(c1) | Var(c1) 
Criteria2 | AVG(c2) | StD(c2) | Var(c2) 
Criteria3 | AVG(c3) | StD(c3) | Var(c3) 
...  | ...  | ...  | ... 
CriteriaX | AVG(cX) | StD(cX) | Var(cX) 

, где AVG (с1), StD (с1), вар (с1), и т.д., являются средними, станд DEV, и дисперсия из всех различных критериев взвешивания ответов сверху (n1w1, n1we, n1wX и т. д.)

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

Спасибо за любую помощь.

ответ

2

К сожалению, кросс-план идет в другую сторону. Если бы вы начали с вашей желаемой структуры (WeightsinStats) и вам понадобилась ваша оригинальная структура (CriteriaWeighting), кросс-таблицы могут ее достичь. Конечно, с агрегацией на преобразованном конце.

Причина в том, crosstab queries превращает рекорд, установленный таким образом, что значение элементы из одного столбца становятся отдельными индивидуальными столбцы с соответствующими числовыми показателями будучи агрегированный: Сумму(), средний(), Count() ...

Однако, обращаясь назад, вам может понадобиться выполнить запрос UNION. Обратите внимание: ограничение доступа SQL к количеству союзов зависит от сложности.

SELECT 'Criteria1' As Criteria, Avg([Criteria1]), StDev([Criteria1]), Var([Criteria1]) 
FROM CriteriaWeighting 
UNION 
SELECT 'Criteria2' As Criteria, Avg([Criteria2]), StDev([Criteria2]), Var([Criteria2]) 
FROM CriteriaWeighting 
... 

Если у вас есть несколько критериев, вы можете создать свой союзный запрос динамически с помощью VBA:

Dim db As Database 
Dim strSQL As String 
Dim qdef As QueryDef 
Dim i As Integer, AllCriteriaCount As Integer 

AllCriteriaCount = ?? 'ENTIRE FULL COUNT OF CRITERIA HERE 

Set db = Currentdb 

' BUILD SQL STRING 
For i = 1 To AllCriteriaCount 

    If i = 1 Then 
    strSQL = "SELECT 'Criteria1' As Criteria, Avg([Criteria1]), StDev([Criteria1]), Var([Criteria1])" & _ 
      " FROM CriteriaWeighting" 
    Else 
    strSQL = strSQL & "UNION" & _ 
      " SELECT 'Criteria" & i & "' As Criteria, Avg([Criteria" & i & "]), StDev([Criteria" & i & "]), Var([Criteria" & i & "])" & _ 
      " FROM CriteriaWeighting" 
    End If 
Next i 

' CREATE QUERY DEF (STORED QUERY) 
Set qdef = db.CreateQueryDef("WeightinStatsquery", strSQL) 

' MAKE-TABLE TO OUTPUT FINAL 
db.Execute "SELECT * WeightinStatsquery INTO WeightinStats" 

Set qdef = Nothing 
Set db = Nothing 
+0

Великого. Спасибо за вашу помощь. Мне просто нужно переработать некоторые элементы db. – Extinct23