0

簡単な手順を書くのに助けが必要です。私がやろうとしていることを説明させてください。

私は3つのテーブルを持っています

  1. tJobOffer
  2. tApplication
  3. tApplicationStatus

このtJobOfferのさまざまなステータスの統計を含むtJobOfferのリストを返すプロシージャを作成したいと思います。tApplicationStatusは、tJobOfferにリンクされているtApplicationにリンクされています。アプリケーションは、CANDIDATE / ACCEPTED / REFUSED / IGNORED/..にすることができます。

私はこのクエリを作成しました:

    SELECT 
        [T].[JobOfferId],
        [T].[JobOfferTitle],
        COUNT([A].[ApplicationId]) AS [CandidateCount]

    FROM        [tJobOffer] AS [T]
    LEFT JOIN   [tApplication] AS [A]
        INNER JOIN   [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
            AND     [S].[ApplicationStatusTechnicalName] = 'CANDIDATE'
        ON      [A].[JobOfferId] = [T].[JobOfferId]

    GROUP BY
            [T].[JobOfferId],
            [T].[JobOfferTitle]

    ORDER BY [T].[JobOfferTitle] ;

結果は

> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA  Announce a  0
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C  Announce b  0
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D  Announce c  2
> 258E11A7-79C1-47B6-8C61-413AA54E2360  Announce d  0
> DA582383-5DF4-4E1D-837C-382371BDEF57  Announce e  1

結果は正しいです。ステータス候補の統計を含むtJoboffersを取得します。アナウンスcの候補者が2人、アナウンスeの候補者が1人います。文字列「CANDIDATE」を「ACCEPTED」または「REFUSED」に変更すると、これらのステータスの統計を取得できます。1回のリクエストですべてを取得することは可能ですか?

何かのようなもの

> 52ED7C67-21E1-49BB-A1F8-0601E6EED1EA  Announce a  0   0   2
> F26B228D-0C81-4DA8-A287-F8F997CC1F9C  Announce b  0   0   1
> 9DA60B23-F113-4C7F-9707-2B90C1556D5D  Announce c  2   0   0
> 258E11A7-79C1-47B6-8C61-413AA54E2360  Announce d  0   0   0
> DA582383-5DF4-4E1D-837C-382371BDEF57  Announce e  1   1   0
4

3 に答える 3

5

使用SUMしてCASE

SELECT 
    [T].[JobOfferId],
    [T].[JobOfferTitle],
    SUM(CASE WHEN [S].[ApplicationStatusTechnicalName] = 'CANDIDATE' THEN 1 ELSE 0 END) AS [CandidateCount],
    SUM(CASE WHEN [S].[ApplicationStatusTechnicalName] = 'ACCEPTED' THEN 1 ELSE 0 END) AS [ACCEPTEDCount],
    SUM(CASE WHEN [S].[ApplicationStatusTechnicalName] = 'REFUSED' THEN 1 ELSE 0 END) AS [REFUSEDCount]
FROM    [tJobOffer] AS [T]
        LEFT JOIN   [tApplication] AS [A]
            ON      [A].[JobOfferId] = [T].[JobOfferId]
        LEFT JOIN   [tApplicationStatus] AS [S]
            ON      [S].[ApplicationStatusId] = [A].[ApplicationStatusId]
GROUP BY
        [T].[JobOfferId],
        [T].[JobOfferTitle]
ORDER BY [T].[JobOfferTitle] ;
于 2013-01-03T09:52:39.377 に答える
0

はい、必要な数のカウントを運ぶことができます

これを試して

SELECT COUNT(1),COUNT(2) FROM demoTable;

これにより、列1と列2の行数が表示されます

通常、null 値が許可されていて、いずれかの列に存在しない限り、これは同じカウントになります。いずれかの列に null 値がある場合、そのカウントは異なる可能性があるため、基本的には主キー列にカウントを適用するという考え方です。

Select count(*) from demoTable ; 

この行もカウント値になりますが、テーブル全体に適用されるため、特定の列にカウントを適用するとパフォーマンスが向上します。

精度の問題については、これを主キーまたは非 null 制約を持つ列に適用する必要があります。

さらに進んで、単一のテーブルに制限する必要はありません

SELECT COUNT(1),COUNT(2) FROM ( joins or any selection from any no of table);

選択セットに存在する列の数に注意してください

于 2013-01-03T10:06:47.083 に答える