2013-09-06 5 views
2

У меня есть таблица называется AssetTable, который хранит AssetIDFilteration рядов на основе значения столбца

У меня есть еще одна таблица называется AssetBookTable, который хранит два поля BookID и CurrentOperationsTax

Другая таблица AssetBook, которая хранит AssetId и BookId как ключи foriegn.

Теперь у меня есть ситуация, в которой я должен фильтра записей на основе AssetBookTable.CurrentOperationsTax

Это, что я получаю сейчас, This is so far I have achieved

И это , является то, что я хочу: This is what I want to achieve

**

Логика заключается в том, что я хочу только один BookId для AssetId, который имеет текущий или рабочий/налог для поля CurrentOperationsTax.

**

Вот SQL скрипку написано до сих пор:

SQLFiddle

Любая помощь очень ценится.

+0

Ваши усилия до сих пор являются «ВЫБРАТЬ * ОТ курса»? Эта скрипка имеет * none * столбцов * или * столбцов в вашем вопросе. –

+0

Спасибо, что указал на Майка, я только что исправил свой путь. Это было нечто другое. –

ответ

1

Вы можете легко удалить GROUP BY BookID. Но, конечно же, вам нужно как-то объединить BookID. Здесь с помощью функции MIN():

SELECT 
    ab.AssetId 
    ,MIN(ab.BookId) as BookID 
    ,abt.CuurentOperationsTax 
FROM 
AssetBook ab 
JOIN AssetTable at ON at.AssetId = ab.AssetId 
JOIN AssetBookTable abt ON abt.BookId = ab.BookId 
GROUP BY 
    ab.AssetId 
    ,abt.CuurentOperationsTax 

http://sqlfiddle.com/#!6/e3477/42

1

Я предпочитаю использовать row_number подход. Это требует использования подзапроса. В итоге он группирует записи по номеру CuurentOperationsTax и упорядочивает по идентификатору книги и присваивает номер строки для каждой группы. Затем во внешнем выборе я отфильтровываю, сколько я хочу для каждой группировки. В этом примере только 1.

SELECT AssetId 
     ,BookId 
     ,CuurentOperationsTax 
     ,RowNum 
FROM (
     SELECT 
      ab.AssetId 
      ,ab.BookId 
      ,abt.CuurentOperationsTax 
      ,ROW_NUMBER() OVER(PARTITION BY abt.CuurentOperationsTax ORDER BY ab.BookId) AS RowNum 
     FROM 
     AssetBook ab 
     JOIN AssetTable AT ON AT.AssetId = ab.AssetId 
     JOIN AssetBookTable abt ON abt.BookId = ab.BookId 
    ) AS b 
WHERE b.RowNum = 1 
Смежные вопросы