0

私はSQLをよく知らないので、助けを求めています。

2つのテーブルを結合し、2番目のテーブルのいくつかの値の出現をカウントして、列を持つ統計テーブルのような効果を実現する必要があります。

結果表:

  • 国varchar(20)、
  • サイトvarchar(20)、
  • suspected_violation long、
  • 確認済みの違反が長い、
  • 確認済み_no_violation長い、
  • not_determined long、
  • トータルロング

結果テーブルには、最初の2つの列(contryとsite)が最初のテーブル "Violations"からのものであり、次の5つの列には、Statusテーブルのidの可能な値ごとに "Violations"のstatus_idの発生数(カウント)が含まれている必要があります。

これで、達成したいテーブル結果の画像をアップロードできます。 結果表

したがって、既存の2つのテーブルがあります。違反とステータスです。

違反:

  • id long、
  • 国varchar(20)、
  • サイトvarchar(20)、
  • status_id long、<-これはステータステーブルのステータスのIDです。
  • ...この場合は重要ではない他の列

状態:

  • id long、
  • status long列「status」には、文字列値にマップされる値(1〜4)があります:違反の疑い(1)、違反の確認(2)、違反の確認なし(3)、未決定(4)

私の結合の結果は、列を含むべきテーブルを持つことです:

  • 違反テーブルから:「国」と「サイト」
  • ステータステーブルから:「違反の疑い」、「違反の確認」、「違反の確認なし」、「未決定」、「合計」(この列は違反テーブルでの発生のカウンターです)。

私の擬似コードと抽象試行:

SELECT v.country, v.site, count(v.status_id == 1), count(v.status_id == 2), count(v.status_id == 3), count(v.status_id == 4)
FROM Violations v JOIN Status s 
ON v.status_id=s.id
GROUP BY v.country, v.site

それを行うには大きな問題があるので、罪状認否は私が正しいSQLクエリを書くのを助けます。

4

1 に答える 1

2

CASE結果を取得するには、式で集計関数を使用できるはずです。

select v.country,
    v.site,
    SUM(case when s.id = 1 then 1 else 0 end) Total_SuspectedViolations,
    SUM(case when s.id = 2 then 1 else 0 end) Total_ConfirmedViolations,
    SUM(case when s.id = 3 then 1 else 0 end) Total_ConfirmedNoViolations,
    SUM(case when s.id = 4 then 1 else 0 end) Total_NotDetermined,
    COUNT(*) Total
from violations v
inner join status s
    on v.status_id = s.id
group by v.country, v.site

SQL FiddlewithDemoを参照してください

これは、JOIN:なしで書くこともできます。

select v.country,
    v.site,
    SUM(case when v.status_id = 1 then 1 else 0 end) Total_SuspectedViolations,
    SUM(case when v.status_id = 2 then 1 else 0 end) Total_ConfirmedViolations,
    SUM(case when v.status_id = 3 then 1 else 0 end) Total_ConfirmedNoViolations,
    SUM(case when v.status_id = 4 then 1 else 0 end) Total_NotDetermined,
    COUNT(*) Total
from violations v
group by v.country, v.site

SQL FiddlewithDemoを参照してください

于 2013-03-11T16:52:11.687 に答える