2017-04-26 7 views
0

私は比較的複雑なSQLの新機能を使用しています。レコード数の合計を取得する方法(以前のクエリから)

client load_date report_date record_count 
ABC  4/1/2016 2/28/2016 16108 
PREM 4/19/2016 3/31/2017 5348 
MRV  4/19/2016 3/31/2017 8335 

私は、可能であれば、RECORD_COUNT(または29791)の合計を取得したいと思います:

select 
    case 
    when group_id = 'ABC Acme' then 'ABC' 
    when group_id like 'Premium%' then 'PREM' 
    when group_id like '%Marvel%' then 'MRV' 
    else NULL 
    end client, 
    load_date, report_date, count(*) as record_count 
from tablename 
group by client, load_date, report_date 
order by client, load_date; 

次の値を返します。私は、クエリを持っています。理想的には、この合計を持つ上記の結果に別の行を追加するとよいでしょう。あなたunionレコードセットが一緒に、彼らは同じ数の列を持っている必要があるとき

An error occurred when executing the SQL command: 
--get summary ttl of counts by load_date for each client 
select 
case wh... 
[Amazon](500310) Invalid operation: each UNION query must have the same number of columns; 
Execution time: 0s 
1 statement failed. 
+0

として合計レコードの追加の列を追加することができます。あなたが 'UNION'を望むなら、2つのクエリの両方が同じ数のカラムを持つ必要があります。あなたがあなたの質問に含めるべきことは、あなたの期待される結果が何であるかということです。それで、あなたが質問を作成するのを助けることができます。 –

+0

あなたは@JuanCarlosOropezaです。私はこのすべての問題に取り組むのに役立つ明確な答えを得ました。飛び込んで助けてくれると思っています。とても感謝しています! – Gar

答えて

0

ほとんどのデータベースは間違いなくこれを単純化する、grouping setsまたはrollupサポートしています。

保守性と​​一貫性を保つために、私はCTEを使用することを好む:

with t as (
     select (case when group_id = 'ABC Acme' then 'ABC' 
        when group_id like 'Premium%' then 'PREM' 
        when group_id like '%Marvel%' then 'MRV' 
       end) as client, 
      load_date, report_date, count(*) as record_count 
     from tablename 
     group by client, load_date, report_date 
    ) 
select client, load_date, report_date, record_count 
from ((select t.*, 1 as priority 
     from t 
    ) union all 
     (select 'SUM', NULL, NULL, sum(record_count), 2 
     from t 
    ) 
    ) t 
order by priority, client, load_date; 

ノート:

  • CTEで任意の潜在的なフィルタリング条件や計算を置くことによって、あなたは一貫性を確保します。
  • 実際には、データベースはUNION ALLから順番に行を返します。しかし、これは保証されていません。 priority列を明示的に使用することにより、データの順序が正しいことが保証されます。
  • サブ集約を追加するのはかなり簡単です。
  • grouping setsが好ましい。
+0

あなたの答えはポイントゴードンで100%だった!私はCTEにもっと注意を払う必要があると思う。特に、結果を適切に並べ替えるために「優先度」の使用を追加することが好きでした。私はこの答えで構築することができますし、おそらく私のクエリをもう少し洗練された – Gar

0

:私は次のエラーを取得する

select 
    case 
    when group_id = 'ABC Studios' then 'ABC' 
    when group_id like 'Premium%' then 'PREM' 
    when group_id like '%Marvel%' then 'MRV' 
    else NULL 
    end client, 
    load_date, report_date, count (*) 
from tablename 
    group by client, load_date, report_date 
    union all 
select 'SUM', count(*) 
from tablename; 

...私は次のクエリを試してみましたが、それはうまくいきませんでした。今のところ、第1のクエリには4つの列があり、第2のクエリには2つの列しかありません。 load_dateと2番目のクエリのreport_dateにはnullを選択するだけです(これらのフィールドは総計で意味がありません)。

select 
    case 
    when group_id = 'ABC Studios' then 'ABC' 
    when group_id like 'Premium%' then 'PREM' 
    when group_id like '%Marvel%' then 'MRV' 
    else 
    NULL 
    end client, load_date, report_date, count (*), 1 priority 
    from tablename 
    group by client, load_date, report_date 

    union all 

    select 'SUM', null, null, count(*), 2 priority 
    from tablename 
    order by priority; 
+0

こんにちは@Jerrad、あなたの答えもうまくいきましたが、(ソートの "優先度"を使用して)結果を適切にソートするために、マイナーな変更を加える必要があります。今すぐあなたのソリューションを実行するたびに、私は別のrowidsに表示される要約行を取得します – Gar

+0

簡単に修正することができます。 SELECTに優先順位の列を追加するだけです。実際のデータでは1、合計行では2を指定します。その優先順位でソートすると、合計行が一番下に表示されます。 – Jerrad

+0

確かに、THNXS!これは非常にエレガントでシンプルなソリューションです。私はおそらくそれを少しプレイし、より野心的なシナリオのためにそれを拡張することができます – Gar

0

あなたは、エラーがクリアされている

declare @ttl int; 
Set @ttl = (Select Count(*) from tablename) 
select 
    case 
    when group_id = 'ABC Studios' then 'ABC' 
    when group_id like 'Premium%' then 'PREM' 
    when group_id like '%Marvel%' then 'MRV' 
    else 
    NULL 
    end client, load_date, report_date, count (*), @ttl AS Sum 
    from tablename 
    group by client, load_date, report_date 
+0

@ジェラド:Rahul、このソリューションは私のために(正確に)働いていないが、私はRedshiftを使用していると思う歯を引っ張るように。しかし私はその技術が好きで、私はそれをストアドプロシージャに組み込むことができると思います – Gar

関連する問題