2016-05-28 6 views
0

C#でlistviewに入れるAnalyzeデータテーブルを作成する必要があります。これは私のクエリです:Firebirdのクエリでデータを分析する

SELECT CL.CLIENT_CODE, CL.CLIENT_NAME, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 1, COUNT(CL.CLIENT_CODE), '') AS MONTH1, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 2, COUNT(CL.CLIENT_CODE), '') AS MONTH2, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 3, COUNT(CL.CLIENT_CODE), '') AS MONTH3, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 4, COUNT(CL.CLIENT_CODE), '') AS MONTH4, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 5, COUNT(CL.CLIENT_CODE), '') AS MONTH5, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 6, COUNT(CL.CLIENT_CODE), '') AS MONTH6, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 7, COUNT(CL.CLIENT_CODE), '') AS MONTH7, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 8, COUNT(CL.CLIENT_CODE), '') AS MONTH8, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 9, COUNT(CL.CLIENT_CODE), '') AS MONTH9, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 10, COUNT(CL.CLIENT_CODE), '') AS MONTH10, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 11, COUNT(CL.CLIENT_CODE), '') AS MONTH11, 
    IIF (EXTRACT(MONTH FROM J.CJOB_ASSIGNED) = 12, COUNT(CL.CLIENT_CODE), '') AS MONTH12 
    FROM CLIENTS CL INNER JOIN CJOBS J ON (CL.CLIENT_ID = J.CLIENT_ID) 
    GROUP BY CL.CLIENT_CODE, CL.CLIENT_NAME, EXTRACT(MONTH FROM J.CJOB_ASSIGNED) 

そして、このクエリの結果、データが月ごとに分析したが、それらは、多くの異なるデータ行に分け、各クライアントの行にすべてをなかった: Result Table

私が望む結果は Wish Tableです)。

答えて

0

あなたが月に別々の行を取得する理由は、それがあなたが求めていたものだからです。あなたは月ごとにグループ分けしているので、毎月に独自の行があります。

結果を得るには、最初に月とクライアントに必要なカウントを取得し、その月を月に1回だけピボットするようにクエリを変換する必要があります。

select client_id, extract(month from cjob_assigned), count(*) 
from cjobs 
group by client_id, extract(month from cjob_assigned) 

今、クライアントごとに1つの行とピボットテーブルと月額欄にこれを変換するために、このクエリを実行する必要があります:あなたはのようなクエリが必要とする最初の部分については

クライアントあたり12倍。これを簡単にするために、common table expressionを使用することができます。そのため、毎回選択を繰り返す必要はありません(簡略化として、CTEはインライン表示と見なすことができます)。その後、

最終クエリは次のようになります。

ところで
with jcm (client_id, monthnr, jobcount) as (
    select client_id, extract(month from cjob_assigned), count(*) 
    from cjobs 
    group by client_id, extract(month from cjob_assigned) 
) 
select client_code, client_name, 
    (select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 1) as month1, 
    (select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 2) as month2, 
    -- ... add months 3 - 11 
    (select jobcount from jcm where jcm.client_id = clients.client_id and jcm.monthnr = 12) as month12 
from clients 

:あなたは(つまり、物事はもう少し複雑にしないが)だけでなく年間を含め検討する必要があります。

+0

ありがとうございます。とてもうまく動作します。しかし今、私は12ヶ月間のすべてのデータを合計しようとしています。これは私の疑問の欠陥です。もう一度あなたの助けを得ることを願っています。もう一度お世話になりました。 –

+0

@FoxVĩnhT'm '(jcm.client_id = clients.client_idの合計を' jcmから選んで(jobcount)を集計して)別の列を追加する ' –

+0

私はこの構造体を本当に理解できませんが、私はそれを自分の意図に合わせてカスタマイズしました。本当に便利なので、私はこの構造を研究しようとしています。ありがとうございました。乾杯。 –

関連する問題