2014-01-09 4 views
0

Я создал следующий вид в SQL Server 2008 для создания списков рассылки для владельцев земельных:SQL Server 2008 View Group By

SELECT  
    dbo.parcel.featid, 
    CAST(mms_db.dbo.TR_Roll_Master.FMT_ROLL_NO AS decimal(11, 3)) AS Roll, 
    dbo.parcel.survey, mms_db.dbo.Central_Name_Database.NAME AS Owner, 
    mms_db.dbo.Central_Name_Database.NAME_2 AS Owner2, 
    mms_db.dbo.Central_Name_Database.BOX_NUM, 
    mms_db.dbo.Central_Name_Database.APT_NUM, 
    mms_db.dbo.Central_Name_Database.FMT_STREET AS House_num, 
    mms_db.dbo.Central_Name_Database.CITY AS Town, 
    mms_db.dbo.Central_Name_Database.PROV_CD AS Prov, 
    mms_db.dbo.Central_Name_Database.POST_CD AS Post_code, 
    mms_db.dbo.TR_Roll_Number_Owners.NAME_CODE 
FROM 
    mms_db.dbo.TR_Roll_Master 
INNER JOIN 
    dbo.parcel ON mms_db.dbo.TR_Roll_Master.ROLL_NO = dbo.parcel.roll_no COLLATE SQL_Latin1_General_CP1_CI_AS 
INNER JOIN 
    mms_db.dbo.TR_Roll_Number_Owners ON mms_db.dbo.TR_Roll_Master.ROLL_NO = mms_db.dbo.TR_Roll_Number_Owners.ROLL_NO 
INNER JOIN 
    mms_db.dbo.Central_Name_Database ON mms_db.dbo.TR_Roll_Number_Owners.NAME_CODE = mms_db.dbo.Central_Name_Database.NAME_CODE 
WHERE  
    (mms_db.dbo.TR_Roll_Master.DEL_ROLL NOT LIKE '%Y%') AND 
    (mms_db.dbo.TR_Roll_Master.ROLL_NO NOT LIKE 'P%') OR 
    (mms_db.dbo.TR_Roll_Master.DEL_ROLL IS NULL) AND (mms_db.dbo.TR_Roll_Master.ROLL_NO NOT LIKE 'P%') OR 
    (mms_db.dbo.TR_Roll_Master.DEL_ROLL NOT LIKE '%I%') AND 
    (mms_db.dbo.TR_Roll_Master.ROLL_NO NOT LIKE 'P%') 

Вид отлично работает, однако там часто дублирует как много людей собственного более чем один участок земли. Я хотел бы сгруппировать по Name_Code, чтобы устранить дубликаты.

Когда я добавляю:

Group by mms_db.dbo.TR_Roll_Number_Owners.NAME_CODE 

в конце запроса я вернулся со следующим ответом:

SQL Execution Error.

Выполненная SQL заявление: SELECT dbo.parcel.featid, CAST (mms_db.dbo.TR_Roll_Master.FMT_ROLL_NO AS десятичной (11,3)) AS Ролл, dbo.parcel.survey, mms_db.dbo.Central_NameDatabase.Name Сообщение об ошибке .Net SQLClient поставщика данных: AS Владелец, mms_db.dbo.Central_Name_Database.NAME_2 AS Owner2, mms_db.dbo.Central_Name_Database.B ... Ошибка Источник Column 'dbo.parcel.featid' является недействительным в выберите список , потому что он не содержится ни в агрегатной функции, ни в
Предложение GROUP BY.

Я не уверен, что мне нужно изменить, чтобы сделать эту работу.

--Edit--

В качестве образца данных, вот сгущенное пример того, что я хотел бы достичь

Roll  Owner Box_Num  Town Prov  Post_code Name_Code 

100  John Smith  50  Somewhere MB  R3W 9T7  00478 
200  John Smith  50  Somewhere MB  R3W 9T7  00478 
300  Peter Smith 72  Somewhere MB  R3W 9T9  00592 
400  John Smith  90  OtherPlace MB  R2R 8V7  00682 

Джон Смит имеет кодовое название 00478. Он владеет как Ролл 100 & 200, Питер Смит владеет 300, а другой человек с именем Джона Смита владеет 400. Основываясь на разных значениях Name_Code, я знаю, что два Джона Смита - разные люди. Я бы хотел, чтобы вывести список с Джоном Смитом с Name_Code 00478 1 раз, пока также перечислял Питер Смит и другой Джон Смит. Name_Code - единственное значение, которое я могу использовать для группировки, поскольку остальные могут представлять разных людей с тем же именем.

+0

Для предложения GROUP BY необходимо добавить элементы в том порядке, в котором вы хотите их группировать, пока не достигнете конца группировки, попробуйте добавить 'dbo.parcel.featid' в 'GROUP BY' чем-то вроде' GROUP BY mms_db.dbo.TR_Roll_Number_Owners.NAME_CODE, dbo.parcel.featid' –

+1

Можете ли вы показать некоторые примеры данных, объясняя, какую строку вы хотите сохранить и почему? –

+0

См. Http://stackoverflow.com/questions/13999817/reason-for-column-is-invalid-in-the-select-list-because-it-is-not-contained-in-e –

ответ

0

его красноречивое вам, что делать:

"Error Message: Column 'dbo.parcel.featid' is invalid in the select list 
because it is not contained in either an aggregate function or the 
GROUP BY clause." 

Это означает, что вы должны сгруппировать другие (не агрегированные) поля тоже.

+0

Я не хочу группировать эти другие поля. Есть ли способ объединить другие поля, чтобы он позволял мне группировать только поле name_code? – Jeremy

+0

@jeremey, you8 не может gropu только одним полем. Это не разрешено. – HLGEM

1

Если вы просто хотите избавиться от дубликатов, просто использовать DISTINCT и исключить столбцы, представляющие другой "people on more than one piece of land" от вашего а именно запроса:

SELECT DISTINCT 
    NAME_CODE, 
    {column2}, 
    {column3}, 
FROM 
    [MyView] 

Однако, если вы хотите выполнить агрегацию какой-то, или показать один случайный «людей на более чем одном участке земли», тогда вам понадобится GROUP BY.Все необобщенные столбцы в выбранной необходимости появляться в группе:

SELECT 
    NAME_CODE, 
    ... Other non aggregated fields here 
    COUNT(featid) AS NumFeatIds, 
    MIN(Owner2) AS FirstOwner, 
    ... etc (other aggregated columns) 
GROUP BY 
    NAME_CODE, 
    ... All non-aggregated columns in the select. 

Edit

Чтобы получить таблицу, указанной в вашем редактировании, вы просто должны ORDER BY Name_Code

Однако чтобы получить только одну строку из John Smith #00478, вам необходимо скомпрометировать нестандартные столбцы, исключив их полностью, используя GROUP BY и агрегаты на строках, делая GROUP_CONCAT type hack, например, запятая разделяет их или поворачивает столбцы повторяющихся строк как дополнительные столбцы в одной строке.

Поскольку вы неоднократно упоминали GROUP, кажется, что необходим маршрут агрегирования. John Smith #00478 имеет 2 свойства, следовательно 2 дискретных значения Roll. Таким образом, Roll не может отображаться в агрегированном результате. Поэтому вместо этого вы можете вернуться, например. a count рулонов, или MIN или MAX Рулон, но не оба ряда *. Другие столбцы (связанные с адресом), вероятно, постоянны для всех свойств (при условии, что John Smith 00478 имеет один адрес), но, к сожалению, SqlServer потребует, чтобы вы включили их в GROUP.

Я хотел бы предложить вам попробовать:

SELECT 
    COUNT(Roll) AS NumPropertiesOwned, 
    Owner, 
    Box_Num, 
    Town, 
    Prov, 
    Post_code, 
    Name_Code 
FROM [MyNewView] 
GROUP BY 
    Owner, Box_Num, Town, Prov, Post_code, Name_Code 
ORDER BY Name_Code; 

т.е. всех необобщенные столбцы должны быть повторены в GROUP BY

* если вы не используете GROUP_CONCAT хак или маршрут поворота

+0

Я попробовал функцию Select Distinct, но это не сработало, поскольку у меня есть только отдельное поле - Name_code. Например, может быть более одного человека с тем же именем, его код, который будет их отличать. Другие поля, такие как «roll», необязательно различаются. – Jeremy

+0

@jeremey, вы должны понимать, что у вас нет повторяющихся строк, поэтому группировка или разбор не поможет вам. Дублирующиеся строки - это только дубликаты, каждое значение для каждого столбца одинаково. Если один столбец отличается, тогда у вас разные строки. Так работает SQL и как он должен работать. – HLGEM