Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не отоброжать повторяемые данные в одном столбце  [new]
Пупколиз
Member

Откуда:
Сообщений: 26
Прив. Есть таблички Book, Author и BookAndAthor. В первой табличке есть такие столбцы - id, name. Во второй id, name. В третей id, book_id, author_id. У одной книги может быть несколько авторов, необходимо показать значение в формате: Имя книги - Имя автора, но если книга имеет несколько авторов, то надо чтобы каждая такая книга отображалась только один раз. Как вывести правильные пары: Имя книги - Имя автора, я знаю, я даже нагуглил и напряг мозг, и пронумеровал книги для каждой группы книг с одинаковым именем, вот так Картинка с другого сайта. (не смотрите на then, смотрите на num). Для нумерации я использовал row_number(), далее мне необходимо изменить имя книг на пустую строку в тех строчках, где num > 1. Но как в CASE получить значение столбца num - я не знаю. Вот то, что вышло, по идее, если срабатывает условие, то Имя книги заменяется на пустую строку.
select ROW_NUMBER() over (partition by B.name order by B.name) num, 
CASE
when @@ROWCOUNT>1
then ' '
else cast(B.name as varchar(50))
END name,
 B.name,A.name from BookAndAuthor as BA join Book as B on BA.book_id=B.id join Author as A on BA.author_id=A.id

ну я просто думал, что, возможно, переменная @@ROWCOUNT это то, что мне нужно. но я ошибался. просто все перебробовал, что смог придумать хД Как же получить значение num и показать только один раз имя книги, у которой несколько авторов?
17 сен 13, 02:36    [14847311]     Ответить | Цитировать Сообщить модератору
 Re: Не отоброжать повторяемые данные в одном столбце  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Пупколиз,
для 2005+
with cte as
(select ROW_NUMBER() over (partition by B.name order by BA.name) num, 
 B.name BookName, A.name AuthorName 
from BookAndAuthor as BA 
        join Book as B on BA.book_id=B.id
        join Author as A on BA.author_id=A.id)
SELECT BookName,
CASE when num>1 then ' ' else AuthorName END AuthorName
FROM cte

но скорее всего вам нужно Сложение символьных полей в запросе
Логичнее ведь отображать всех авторов книги, а не одного и пустые строки вместо остальных.
17 сен 13, 04:03    [14847324]     Ответить | Цитировать Сообщить модератору
 Re: Не отоброжать повторяемые данные в одном столбце  [new]
stenford
Member

Откуда: урал
Сообщений: 2831
declare @book table(id int, name varchar(50))
declare @author table(id int, name varchar(50))
declare @book_author table(id int, book_id int, author_id int)

insert into @book values(1, 'book1')
insert into @book values(2, 'book2')
insert into @book values(3, 'book3')

insert into @author values(1, 'author1')
insert into @author values(2, 'author2')
insert into @author values(3, 'author3')

insert into @book_author values(1, 1, 1)
insert into @book_author values(2, 1, 2)
insert into @book_author values(3, 2, 3)
insert into @book_author values(4, 3, 2)
insert into @book_author values(5, 3, 3)

select distinct b1.name as BookName,
(select a.name as 'data()' 
from @author a
join @book_author b on a.id = b.author_id
where b.book_id = b1.id for xml path('')) as Authors
from @book_author a
join @book b1 on a.book_id = b1.id
join @author c on a.author_id = c.id
17 сен 13, 04:04    [14847325]     Ответить | Цитировать Сообщить модератору
 Re: Не отоброжать повторяемые данные в одном столбце  [new]
Пупколиз
Member

Откуда:
Сообщений: 26
Ruuu
Пупколиз,
для 2005+
with cte as
(select ROW_NUMBER() over (partition by B.name order by BA.name) num, 
 B.name BookName, A.name AuthorName 
from BookAndAuthor as BA 
        join Book as B on BA.book_id=B.id
        join Author as A on BA.author_id=A.id)
SELECT BookName,
CASE when num>1 then ' ' else AuthorName END AuthorName
FROM cte

но скорее всего вам нужно Сложение символьных полей в запросе
Логичнее ведь отображать всех авторов книги, а не одного и пустые строки вместо остальных.

дык я всех авторов и отображаю, вы сделали наоборот - авторы не все, а книги все, а надо было сделать книги все, а авторы не все. Ну я переделал уже. У меня вообще другой вопрос, вот с типом varchar все просто, мы просто заменяем неужные данные на пустую строку, а как быть с типом numeric? когда я пытаюсь заменить данные такого типа на пустую строку, то вылазиет ошибка
автор
Error converting data type varchar to numeric.

вот кусок кода, где вылазиет ошибка
CASE when num>1 then '' else "Количество" END  "Количество"

А вот весь дополенный мной код
with cte as
(select ROW_NUMBER() over (partition by B.name order by B.name) num, 
 B.name as "Название книги" , A.name as "Имя автора", A.surname as "Фамилия автора", A.father_name as "Отчество автора", 
 G.name as "Жанр", Y.year  as "Год", B.number as "Количество"
from BookAndAuthor as BA 
        join Book as B on BA.book_id=B.id
        join Author as A on BA.author_id=A.id
		join BookAndYear as BAY on BA.book_id=BAY.book_id
		join Year as Y on BAY.year_id=Y.id
		join BookAndGenre as BG on BA.book_id=BG.book_id
		join Genre as G on BG.genre_id=G.id
		)
SELECT CASE when num>1 then '' else "Название книги" END "Название книги", "Имя автора" ,"Фамилия автора",
"Отчество автора", CASE when num>1 then '' else "Жанр" END "Жанр", CASE when num>1 then '' else YEAR("Год") END "Год" ,
 CASE when num>1 then '' else "Количество" END  "Количество"
from cte
17 сен 13, 12:32    [14848686]     Ответить | Цитировать Сообщить модератору
 Re: Не отоброжать повторяемые данные в одном столбце  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Пупколиз
вот кусок кода, где вылазиет ошибка
CASE when num>1 then '' else "Количество" END  "Количество"

Как вариант,
CASE when num>1 then '' else cast("Количество" as varchar(30)) END  "Количество"
17 сен 13, 12:41    [14848749]     Ответить | Цитировать Сообщить модератору
 Re: Не отоброжать повторяемые данные в одном столбце  [new]
Ruuu
Member

Откуда: Иркутск
Сообщений: 4272
Пупколиз
вы сделали наоборот - авторы не все, а книги все, а надо было сделать книги все, а авторы не все.
Логика предикатов и простой жизненный опыт говорят, что это одно и то же. )
17 сен 13, 12:50    [14848825]     Ответить | Цитировать Сообщить модератору
 Re: Не отоброжать повторяемые данные в одном столбце  [new]
Пупколиз
Member

Откуда:
Сообщений: 26
Гость333
Пупколиз
вот кусок кода, где вылазиет ошибка
CASE when num>1 then '' else "Количество" END  "Количество"

Как вариант,
CASE when num>1 then '' else cast("Количество" as varchar(30)) END  "Количество"

спасибо хД
17 сен 13, 12:51    [14848833]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить