Группировка и накопление записей одновременно - PullRequest
0 голосов
/ 09 марта 2011

Я пишу запрос к расширенной таблице «многие ко многим» в моей базе данных.Я называю это расширенной таблицей, потому что это таблица «многие ко многим» с дополнительным полем.Таблица отображает данные между таблицей полей и таблицей студентов.Таблица полей содержит потенциальные поля, которые студент может использовать, вроде системы контактов (например, имя, школа, адрес и т. Д.).Таблица студенческих значений, к которой мне нужно выполнить запрос, содержит идентификатор поля, идентификатор студента и ответ поля (т.е. studentid = 1; fieldid = 2; response = Dave Long).

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

Table Layout

Что мне нужно сделать, это взять несколько переданных значений и создать сгруппированный накопленный отчет.Я хотел бы сделать как можно больше в SQL.

Чтобы у меня были данные, сгруппированные по полю (идентификатор поля), накопительное поле (идентификатор поля) и мне нужно сгруппироватьстуденты по группам по полям, а затем в каждой группе подсчитывают количество студентов в совокупных полях.

Так, например, у меня есть эти данные

ID     STUDENTID     FIELDID     RESPONSE 
1      1             2 *(city)*  Wallingford
2      1             3 *(state)* CT
3      2             2 *(city)*  Wallingford
4      2             3 *(state)* CT
5      3             2 *(city)*  Berlin
6      3             3 *(state)* CT
7      4             2 *(city)*  Costa Mesa
8      4             3 *(state)* CA

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

CA - 1 Student
Costa Mesa          1

CT - 3 Students
Berlin              1
Wallingford         2

Это возможно сделать с одним оператором SQL или мне нужно получить все группы, а затем зациклить их?

РЕДАКТИРОВАТЬ Вот код, который я получил до сих пор, но он не дает надлежащего состояния Subtotal (stateSubtotal совпадает с citySubtotal)

SELECT state, count(state) AS stateSubtotal, city, count(city) AS citySubtotal
FROM(
  SELECT s1.response AS city, s2.response AS state
  FROM studentvalues s1
  INNER JOIN studentvalues s2
    ON s1.studentid = s2.studentid
  WHERE s1.fieldid = 5
    AND s2.fieldid = 6
) t
GROUP BY city, state

1 Ответ

2 голосов
/ 09 марта 2011

Таким образом, чтобы создать таблицу, которая выглядит так, я бы предположил что-то вроде

State  StateSubtotal   City         CitySubtotal
CA     1               Costa Mesa   1
CT     3               Berlin       1
CT     3               Wallingford  2

Было бы то, что вы хотите.Мы не можем просто группировать по Ответу, так как если бы у вас был ответ ученика из Лос-Анджелеса для города, и другой ученик, отвечавший из Лос-Анджелеса за штат (Луизиана), они бы добавили.Кроме того, если один и тот же город находится в разных штатах, нам необходимо сначала определить связь между городом и штатом, указав идентификатор студента.

edit - действительно, ошибочный первый подход.Разные агрегаты требуют разных группировок, поэтому на самом деле требуется один выбор для каждой агрегации.Это дает правильный результат, но это уродливо, и я уверен, что его можно улучшить.Если бы вы работали на SQL Server, я бы подумал, что CTE поможет, но это не вариант.

select t2.stateAbb, stateSubtotal, t2.city, t2.citySubtotal from 
(
select city, count(city) as citySubTotal, stateAbb from (
select s1.Response as city, s2.Response as StateAbb
from aaa s1 inner join aaa s2 on s1.studentId = s2.studentId 
where s1.fieldId = 2 and s2.fieldId=3
) t1 
group by city, stateabb
) t2 inner join (
select stateAbb, count(stateabb) as stateSubTotal from (
select s1.Response as city, s2.Response as StateAbb
from aaa s1 inner join aaa s2 on s1.studentId = s2.studentId 
where s1.fieldId = 2 and s2.fieldId=3
) t3 
group by stateabb
) t4 on t2.stateabb = t4.stateabb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...