2

SQL クエリがあり、正常に動作します。

select monthname (timestamp_iso(STATUSDATE)), 

    count (case when service='ADSL' then 1 end) as  ADSL,
    count (case when service='IPTV' then 1 end) as  IPTV,
    count (case when service='VOIP' then 1 end) as  VOIP
from INCIDENT
group by monthname(timestamp_iso(STATUSDATE))

その月の各月のサービス数を取得しています。しかし、これらのサービスは 100 以上あります。動的な CASE WHEN を使用することは可能ですか? すべてのサービスを取得するには、各サービスについて、その月にそれらの数を返します。また、サービスの AS 名の後に me と記載する必要があります。別のオプションは、これらの 100 個のサービスを手動で作成することです。ありがとう

4

3 に答える 3

3

SQLで動的な列数を設定することはできません。

実行するSQL(動的SQL)を記述するコード(SQLまたは別の言語)を記述できますが、それは面倒になる可能性があります。WSo、結果のSQLクエリは固定数の列に対するものですが、実行するたびにSQLクエリを変更するコードがあります。

ニーズに適合し、動的な再コーディングを必要としない標準のリレーショナルデータベースモデルは、結果を正規化することです...

SELECT
  monthname (timestamp_iso(STATUSDATE)),
  service,
  COUNT(*) AS count_service
FROM
  incident
GROUP BY
  monthname(timestamp_iso(STATUSDATE)),
  service

次に、質問は次のようになります。取得する列の数がわからない場合、ピボットされた結果セットが本当に必要ですか?

于 2012-05-17T11:47:09.913 に答える
2

これを行いたい場合は、プログラミング言語でselect DISTINCT serviceクエリを作成できます

たとえば、C# では

string SQL = "select monthname (timestamp_iso(STATUSDATE))" 

List<string> Columns = new List<string>();
foreach(string service in Services)
{
     Columns.Add( "  count (case when service='"+service+"' then 1 end) as  "+service);
}

SQL +="," + String.Join(",",Columns.ToArray());
SQL += " from INCIDENT group by monthname(timestamp_iso(STATUSDATE))";

db.Query(SQL);

Javascript で:

  var SQL = "select monthname (timestamp_iso(STATUSDATE))"; 

var Columns = new Array();
foreach(string service in Services)
{
     Columns.push( "  count (case when service='"+service+"' then 1 end) as  "+service);
}

SQL +="," + Columns.Join(',');
SQL += " from INCIDENT group by monthname(timestamp_iso(STATUSDATE))";

db.Query(SQL);

他の方法でオラクルを使用する場合は、PL/SQL を記述して列を選択し、クエリを動的に構築してから、EXECUTE IMMEDIATEStatementを使用できます。

于 2012-05-17T11:53:06.470 に答える
1
select 
    service,
    monthname (timestamp_iso(STATUSDATE)), 
    count (*)              
from 
    INCIDENT
where 
    service in ('ADSL','IPTV','VOIP')
group by 
    monthname(timestamp_iso(STATUSDATE)), 
    service

これにより、あなたが望むものに近づくことができると思います。

于 2012-05-17T11:46:06.993 に答える