sql >> データベース >  >> RDS >> Sqlserver

SQLでの製品価格比較

    これがあなたが探しているものだと思います。

    SQLFiddle

    ややこしいですが、ここで少し内訳を示します。

    このブロックを使用すると、値の動的リストを取得できます。 (誰からこれを盗んだのか思い出せませんが、素晴らしいです。これがなければ、ピボットは、これに対する巨大なケース ステートメント アプローチよりも優れているとは言えません。)

    DECLARE @cols AS VARCHAR(MAX)
    DECLARE @query AS NVARCHAR(MAX)
    select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(SellerName)
                          FROM Product_Price
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '')
    

    @cols 変数は次のようになります:

    [Amazon],[eBay],[Sears]
    

    次に、クエリ全体の文字列を作成する必要があります:

    select @query = 
    'select piv1.*, tt.sellername from (
    select *
    from
    (select dt, product, SellerName,  sum(price) as price from product_price group by  dt, product, SellerName) t1
    
    pivot (sum(price) for SellerName in (' + @cols + '))as bob
    ) piv1
    inner join
    (select t2.dt,t2.sellername,t1.min_price from
    (select dt,  min(price) as min_price  from product_price group by  dt) t1
    inner join (select dt,sellername, sum(price) as price from product_price group by dt,sellername) t2 on t1.min_price = t2.price) tt
    on piv1.dt = tt.dt
    '
    

    piv1 派生テーブルは、ピボットされた値を取得します。巧妙に名付けられた tt 派生テーブルは、毎日の売上が最小の販売者を取得します (ちょっと醜いと言っていましたが)。

    最後に、クエリを実行します:

    execute(@query)
    

    そして、あなたは得る:

     DT     PRODUCT     AMAZON  EBAY    SEARS   SELLERNAME
    2012-01-16  AA  40  27  32  eBay
    2012-01-17  BC  30  51.4    33.2    Amazon
    2012-01-18  DE  11.1    9.4     13.5    eBay
    

    (申し訳ありませんが、そのビットを並べることはできません)。

    クロス集計を実行できるレポート ツールがあれば、はるかに簡単に実行できると思います.



    1. Mac OSXでMAMPを使用しているときに、CakePHPをベイクしてmysql.sockを検索し、MySQLを認識するにはどうすればよいですか?

    2. MariaDB JSON_MERGE()の説明

    3. Oracleのテーブルから重複する行を削除する

    4. MySQLからHH:MM形式で時間を取得する