2

すべてのドキュメントとそれらに関するさまざまな情報をリストするDocumentsという 1 つのテーブルがあります。私がやろうとしているのは、選択した作成者グループについて、彼らが過去 1 年間に作成したすべてのドキュメントの数を取得することです。ドキュメントごとに、作成者の名前と ID を格納する列があります。

私は現在、以下のクエリで必要なものを取得していますが、私の問題は、ドキュメントを作成していないすべての作成者もリストする必要があることです。(したがって、Number of Docs Signed列の場合、値はゼロになります) ここに私が今持っているものがあります:

SELECT 
[AuthorID] As "Author ID",
RTRIM([AuthorFirstName]) + ' ' + RTRIM([AuthorLastName]) AS "Author", 
COUNT(Document.ID) AS "Number of Docs Authored"

FROM Document

WHERE   [CompletedStatus] = 'Yes' 
AND     [AuthorID] IN (<list of author ID's>) 
AND     [CompletedOn] >= DATEADD(d, -365, getdate())


GROUP BY [AuthorID], [AuthorFirstName], [AuthorLastName]

ORDER BY [Number of Docs Signed] DESC

SO を読んでみると、COUNT によって返される行がない場合に「0」を表示するには、参加できる何らかのサブクエリが必要だと思います。しかし、私の人生では、それを行う方法がわかりません。私はそれがこのようなものである必要があると確信しています。

4

3 に答える 3

3

Authorsテーブルから開始し、documentsテーブルへの左外部結合を実行します。これは、基準を外部結合に移動する必要があることを意味します...

SELECT 
[AuthorID] As "Author ID",
RTRIM([AuthorFirstName]) + ' ' + RTRIM([AuthorLastName]) AS "Author", 
COUNT(Document.ID) AS "Number of Docs Authored"

FROM 
    Author a
    LEFT OUTER JOIN Document d on d.AuthorID = a.ID
        AND [CompletedStatus] = 'Yes' 
        AND [CompletedOn] >= DATEADD(d, -365, getdate())
WHERE
    a.ID IN (<list of author ID's>) 

GROUP BY a.[ID], [AuthorFirstName], [AuthorLastName]

ORDER BY [Number of Docs Signed] DESC
于 2012-11-12T16:57:01.053 に答える
2

おそらく、ドキュメントを作成していない場合、ドキュメント テーブルにレコードはありません。Authors テーブルなどがあると思いますか?

何かのようなもの

SELECT 
a.[AuthorID] As "Author ID",
RTRIM(a.[AuthorFirstName]) + ' ' + RTRIM(a.[AuthorLastName]) AS "Author", 
COUNT(Document.ID) AS "Number of Docs Authored"
FROM Author a
LEFT OUTER JOIN
Document
ON A.AuthorId = Document.AuthorId
AND  [CompletedStatus] = 'Yes' 
AND     [CompletedOn] >= DATEADD(d, -365, getdate())
WHERE     A.[AuthorID] IN (<list of author ID's>) 
GROUP BY a.[AuthorID], a.[AuthorFirstName], a.[AuthorLastName]
于 2012-11-12T17:00:30.560 に答える
2

著者テーブルがある場合は、次のようにします。

SELECT  a.AuthorID As "Author ID",
        RTRIM([a.AuthorFirstName]) + ' ' + RTRIM([a.AuthorLastName]) AS "Author", 
        COUNT(Document.ID) AS "Number of Docs Authored"
FROM Authors a left outer join
     Document d
     on a.[AuthorID] = d.[AuthorID] and
        d.CompletedStatus = 'Yes' and
       [CompletedOn] >= DATEADD(d, -365, getdate())
WHERE a.[AuthorID] IN (<list of author ID's>) and
GROUP BY a.AuthorID, a.AuthorFirstName], a.authorLastName
ORDER BY [Number of Docs Signed] DESC

ドキュメントのすべての条件がon条項に含まれていることに注意してください。それ以外の場合、ドキュメントのない作成者の値は NULL になります。

作成者テーブルがない場合は、その場で作成できます。

with authors as (
    select <id> as id, <firstname> as authorFirstName, <lastname> as authorLastName union all
    select . . .
)

そして、上記のクエリを使用します。各著者に名前情報を入力する必要があります。

于 2012-11-12T17:00:33.223 に答える