0

私は通話記録を含むデータベースを持っています (私はテレマーケティング担当者ではありません。これは緊急通話データです)。各行は通話記録です。一部の列には、タイミング情報が含まれています。各通話には優先度の列もあります。次のようになります。

  PRIORITY    TIMING1     TIMING2     TIMING3
  -----0----------22----------3-----------43 
  -----1----------42----------10----------12
  -----0----------12----------13----------6
  -----2----------23----------12----------37
  -----1----------12----------16----------23

私が必要とする出力は、基本的に、優先度によってグループ化されたすべての時間の合計を列として、タイミングごとにこの 1 行です。私が事前に知っているタイミングと優先順位は一定数あります。次のようになります。

------------Priority 0-------Priority 1-------Priority 2
  Timing1----123--------------332--------------233
  Timing2----265--------------241--------------302
  Timing3----387--------------192--------------201

単一のクエリでこのようなことを行うことは可能ですか? クエリは、リソースがかなり制限されているモバイル プラットフォームでも実行できる必要がありますが、実行時間はそれほど重要ではありません。このテーブルのサイズとメモリの問題を考えると、一時テーブルは避けたいと思います。

4

4 に答える 4

3

これにはUNPIVOTandを使用できます。PIVOT

これはクエリの静的バージョンです。静的バージョンは、値をハードコーディングすることを意味します。

select *
from
(
  select *
  from
  (
    select priority, timing1, timing2, timing3
    from yourtable
  ) x
  unpivot
  (
    value
    for field in (timing1, timing2, timing3)
  ) u
) x1
pivot
(
  sum(value)
  for priority in ([0], [1], [2])
) p

SQL Fiddle with Demoを参照してください

これを動的に行うこともできます。

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX),
    @colsPivotName as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+ quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourtable') and
               C.name LIKE 'timing%'
         for xml path('')), 1, 1, '')

select @colsPivot = 
    STUFF((SELECT distinct ',' + Quotename(priority)
             from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsPivotName = 
    STUFF((SELECT distinct ',' 
           + Quotename(priority) + ' as Priority' + cast(priority as varchar(1))
             from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query 
  = 'select col, '+ @colsPivotName +'
      from
      (
        select priority, val, col
        from 
        (
          select priority, ' + @colsUnpivot + '
          from yourtable
        ) x
        unpivot
        (
          val
          for col in ('+ @colsUnpivot +')
        ) u
      ) x1
      pivot
      (
        sum(val)
        for priority in ( '+ @colspivot + ')
      ) p'

exec(@query)

SQL Fiddle with Demoを参照してください

編集#1、コメントで、機能のないSQLiteを使用していると述べましたPIVOTUNION ALLただし、 を使用してから、 を使用した集計関数を使用してこれを行うことができますCASE

select col,
  sum(case when priority = 0 then value end) as Priority0,
  sum(case when priority = 1 then value end) as Priority1,
  sum(case when priority = 2 then value end) as Priority2
from
(
  select priority, timing1 as value, 'timing1' as col
  from yourtable
  union all
  select priority, timing2 as value, 'timing2' as col
  from yourtable
  union all
  select priority, timing3 as value, 'timing3' as col
  from yourtable
) x
group by col

SQL Fiddle with Demoを参照してください

于 2012-09-05T17:13:38.233 に答える
1

テーブルの反転/反転を気にしない場合は、これを試すことができます。

SELECT PRIORITY, SUM(TIMING1), SUM(TIMING2), SUM(TIMING3)
  FROM tbl
 GROUP BY PRIORITY
 ORDER BY PRIORITY
于 2012-09-05T17:10:21.360 に答える
0

SQL SumおよびOver関数を使用して、集計合計を実行します。次のリンクを参照してください:http ://www.sqlteam.com/article/sql-sever-2005-using-over-with-aggregate-functions

于 2012-09-05T17:07:58.200 に答える
0

あなたが知っている固定数の行と列があると言うので、ここに素朴な実装があります:

SELECT 'Timing1' AS Timing, SUM(IIF(PRIORITY = 0, TIMING1, 0)) AS [Priority 0],
    SUM(IIF(PRIORITY = 1, TIMING1, 0)) AS [Priority 1], 
    SUM(IIF(PRIORITY = 2, TIMING1, 0)) AS [Priority 2]
FROM CallRecords
UNION ALL
SELECT 'Timing2' AS Timing, SUM(IIF(PRIORITY = 0, TIMING2, 0)) AS [Priority 0], 
    SUM(IIF(PRIORITY = 1, TIMING2, 0)) AS [Priority 1], 
    SUM(IIF(PRIORITY = 2, TIMING2, 0)) AS [Priority 2]
FROM CallRecords
UNION ALL
SELECT 'Timing3' AS Timing, SUM(IIF(PRIORITY = 0, TIMING3, 0)) AS [Priority 0], 
    SUM(IIF(PRIORITY = 1, TIMING3, 0)) AS [Priority 1], 
    SUM(IIF(PRIORITY = 2, TIMING3, 0)) AS [Priority 2]
FROM CallRecords

この形式で絶対に必要でない限り、@ n8wrlが提案するようにテーブルを反転する方がおそらく高速です。

于 2012-09-05T17:11:39.297 に答える