2

現在、デバイスとその販売時期に関する情報の長いリストである表があります。次のようなテーブルを取得する必要があります。

Item   |  Time Sold
--------------------
  A        05/2010
  B        04/2010
  C        03/2010
  A        04/2010
  A        05/2010

そして、以下のように、最初の列としてアイテムを含むテーブルを作成し、日付の数を列ヘッダーにします。

Item   |   Count_03/2010   |  Count_04/2010  |  Count_05/2010
-------------------------------------------------------------
  A    |         0         |         1       |        2
  B    |         0         |         1       |        0
  C    |         1         |         0       |        0

これを行う簡単な方法はありますか?他の言語では、それを行うための単一のコマンドがあることを知っています.SQLにコマンドがあるかどうか疑問に思っていました.

編集

私の問題は、複数のテーブルがあり、一部のテーブルでは月が他のテーブルと異なる場合があることです。リストされた変数を取得し、それらを使用してコード内の列を作成することにより、それらすべてに適用されるスクリプトを作成する方法はありますか? 月が常に同じになることがわかっていれば書くことができますが、月は可変であるため、これを行う方法はありますか.

4

4 に答える 4

4

SQL Server 2005以降にはと呼ばれるものpivotがありますが、それでも1つのコマンドではないため、[販売時間]列の値を知る必要があります。ItzikBen-GanがInsideMicrosoftSQL Server 2008:T-SQLQueryingの本で示した動的ピボットアプローチを使用できます。

create table #test (Item char(1),  TimeSold varchar(20))

  insert #test values('A','05/2010')
  insert #test values('B','04/2010')
  insert #test values('C','03/2010')
  insert #test values('A','04/2010')
  insert #test values('A','05/2010')

  SELECT *
FROM
(SELECT Item,TimeSold
FROM #test) AS pivTemp
PIVOT
(   COUNT(TimeSold)
    FOR TimeSold IN ([05/2010],[04/2010],[03/2010])
) AS pivTable
于 2010-08-18T13:15:37.810 に答える
3

私はそれをテストしませんでしたが、以下はうまくいくはずです。サブクエリを使用して、目的の結果を取得します。

select item, 
(select count(*) from items i where time_sold between '02/2010' AND '03/2010' i.item=item ),
(select count(*) from items i where time_sold between '03/2010' AND '04/2010' i.item=item ),
(select count(*) from items i where time_sold between '04/2010' AND '05/2010' i.item=item )
from items;
于 2010-08-18T13:09:03.860 に答える
2

ネイティブの MS-SQL は、列名を生成する値を知らなくても、必要な表形式でデータを表示する機能を提供しません。

MS-SQL でのクロス集計クエリの動的作成に関する優れた記事があります。ハックですが、うまくいくようです。

それ以外の場合、より柔軟なアプローチは...

Select Distinct
Item,
Time Sold,
Count([Item])
From
MyTable
Group By
Item,
Time Sold

これにより、次のことが得られます。

    アイテム | 販売時間 | カウント
    ------------------------
    あ | 2010年5月 | 2
    あ | 2010年4月 | 1
    ビ | 2010年4月 | 1
    シー | 2010年3月 | 1

列名が既知であるため、データを処理するクエリを作成できるため、これはデータ分析に使用するのにはるかに優れた形式です。

たとえば、レポート ツールでこのデータを使用して、次のことができます。

  • 売れた商品を数える
  • 日付の個別のリストを表示する
  • 最も商品が売れた日付のリストを表示する

要求したレポート形式にするには、Crystal Reports や Excel などのレポート ツールを使用することをお勧めします。

Excel と Crystal Report はどちらも、希望する表形式でデータを表示するためのピボット テーブルをサポートしています (見た目もよくなります!)。

于 2010-08-18T13:14:46.967 に答える
1

group byアイテムごとに集計結果を取得できます。とを使用するsumcase、特定の期間のアイテムの数を数えることができます。例えば:

select  item
,       sum(case when time_sold between '02/2010' and '03/2010' then 1 end)
,       sum(case when time_sold between '03/2010' and '04/2010' then 1 end)
,       sum(case when time_sold between '04/2010' and '05/2010' then 1 end)
from    items
group by
        item

複数の形式のソーステーブルがある場合は、サブクエリでそれらを結合します。スペースを節約するために、この例を1つの範囲のみに制限します。

select  item
,       sum(IsInRange1)
from    (
        select  item
        ,       case when time_sold between '01/2010' and '03/2010' 
                          then 1 end as IsInRange1
        from    usa_items
        union all
        select  item
        ,       case when time_sold in ('gennaio', 'febbraio', 'marzo') 
                          then 1 end
        from    italian_items
        union all
        select  item
        ,       case when time_sold between '2010-01-01' and '2010-03-01' 
                          then 1 end
        from    iso_items
        ) SubqueryAlias
group by
        item
于 2010-08-18T13:16:19.240 に答える