1

次のように、従業員ごとの貸出本の数を表示するクエリを作成した図書館データベースがあります。

select Emploee.[Emp-No],count(*)  as ecount
from Emploee 
inner join Loan on Emploee.[Emp-No]=Loan.[Emp-No]
inner join Book on Loan.ISBN=Book.ISBN group by Emploee.[Emp-No] 

上記のクエリの結果は次のようになります。

Emp-No    ecount
------------------
1000      4
1001      2
1002      3

ここで、出力を変更し、結果の各行の ecount 列を別のクエリと比較して、そのユーザーによって発行された特定の書籍に基づいて貸与された本の数を比較したいと思います。つまり、探している結果は次のようなものです。

Emp-No    ecount     
-----------------
1000      4             

従業員 1000 が 1 つの出版社からすべての本を貸与したとします。彼は結果に表示されます。

このようなもの

 "..... my query...." having ecount= 
     (select count(*) from books where publisher='A')

しかし、結果のecountを別のクエリで使用することはできません:(

4

2 に答える 2

5

明確にした後、質問を次のように理解しました。単一の出版社から本を借りただけの従業員を返してください。

句で使用することでそれを行うことができCOUNT(DISTINCT publisher)ます。HAVING

そのようです:

declare @employee table (id int);
declare @books table (isbn int, title varchar(50), publisher varchar(50));
declare @loan table (employee_id int, book_isbn int);

insert @employee values (1000); 
insert @employee values (1001);
insert @employee values (1002);

insert @books values (1, 'Some Book', 'Publisher A'); 
insert @books values (2, 'Some Book', 'Publisher A'); 
insert @books values (3, 'Some Book', 'Publisher A'); 
insert @books values (4, 'Some Book', 'Publisher B'); 
insert @books values (5, 'Some Book', 'Publisher B'); 
insert @books values (6, 'Some Book', 'Publisher B');

insert @loan values (1000, 1);
insert @loan values (1000, 2);
insert @loan values (1001, 3);
insert @loan values (1001, 4);
insert @loan values (1001, 5);


-- Show the number of different publishers per employee

select e.id, count(*)  as ecount, count(DISTINCT b.publisher) as publishers
from @employee e
 inner join @loan l  on e.id = l.employee_id
 inner join @books b on l.book_isbn = b.isbn
group by e.id

-- yields: id          ecount      publishers
--         ----------- ----------- -----------
--         1000        2           1
--         1001        3           2



-- Filter on the number of different publishers per employee

select e.id, count(*)  as ecount
from @employee e
 inner join @loan l  on e.id = l.employee_id
 inner join @books b on l.book_isbn = b.isbn
group by e.id
having count(DISTINCT b.publisher) = 1

-- yields: id          ecount
--         ----------- -----------
--         1000        2
于 2013-05-11T16:02:59.510 に答える
2

別のクエリで集計を参照するには、集計にエイリアスが必要です。SQL Server では、同じレベルでエイリアスを参照することはできません。したがって、別のサブクエリでエイリアスを使用する前に、エイリアスを定義するサブクエリが必要です。

たとえば、次の SQL では、サブクエリを使用して のエイリアスを定義していbookcountますcount(*)。この最初のサブクエリのおかげで、where句の 2 番目のサブクエリは以下を使用できますbookcount

declare @books table (title varchar(50), author varchar(50));
declare @author_filter table (name varchar(50), bookcount int);

insert @books values 
    ('The Lord of the Rings', 'J.R.R. Tolkien'), 
    ('The Silmarillion', 'J.R.R. Tolkien'), 
    ('A Song for Arbonne', 'G.G. Kay');
insert @author_filter values 
    ('2_books', 2);

select  *
from    (
        select  author
        ,       count(*) as bookcount
        from    @books
        group by
                author
        ) authors
where   '2_books_filter' = 
        (
        select  filter.name
        from    @author_filter filter
        where   authors.bookcount = filter.bookcount
        )
于 2013-05-11T15:45:22.047 に答える