1

このクエリがあります

SELECT Date,  IFNULL(Price, '------') AS Price
       FROM productHistory
WHERE Date between '2012-08-15' and '2012-08-19' AND Company='AAA' AND Product='PPP'
GROUP BY Date

結果は次のとおりです。

Date.......Price
-------------------
2012-08-15...100,00 
2012-08-19...110,00

次のようになります。

Date.........Price
-------------------------------------
2012-08-15......100,00   
2012-08-16......--------
2012-08-17......--------
2012-08-18......--------
2012-08-19......110,00

このフォーラムで同様の質問を確認しましたが、解決策が見つかりませんでした。

これを取得したら、次のような結果を得るために、さらに会社をクエリの列として追加したいと考えています。このためには、クエリを変更する必要があります..

Date.........PriceCompany1.....PriceCompany2.....PriceCompany3 
----------------------------------------------------------  
2012-08-15......100,00................................100,00..................................100,0
2012-08-16......---------...............................100,00...................................---------
2012-08-17......---------..............................----------.................................110,00
2012-08-19......110,00..............................100,00..................................----------

私は何をする必要がありますか?

4

2 に答える 2

0

手順は必要ありません。単純な SQL だけで十分です。

-- generate "pseudo calendar table" from the data:
WITH dt AS (
        SELECT DISTINCT zdate FROM producthistory
        WHERE zdate between '2012-08-10' and '2012-08-20'
        )
-- a poor man's PIVOT:
SELECT dt.zdate
        , pa.price AS price_a
        , pb.price AS price_b
        , pc.price AS price_c
FROM dt
LEFT JOIN producthistory pa ON pa.zdate = dt.zdate AND pa.company='AAA' AND pa.product='ppp'
LEFT JOIN producthistory pb ON pb.zdate = dt.zdate AND pb.company='BBB' AND pb.product='ppp'
LEFT JOIN producthistory pc ON pc.zdate = dt.zdate AND pc.company='CCC' AND pc.product='ppp'

ORDER BY zdate
;

OPにはテーブル定義やデータが表示されないため、独自のものを発明する必要があります。

CREATE TABLE producthistory
        ( company varchar
        , product varchar
        , zdate Date NOT NULL
        , price INTEGER
        );

INSERT INTO producthistory ( company, product, zdate, price ) VALUES
  ( 'AAA', 'ppp', '2012-08-15', 100)
, ( 'AAA', 'ppp', '2012-08-15', 110)
, ( 'AAA', 'ppp', '2012-08-15', 120)
, ( 'BBB', 'ppp', '2012-08-16', 200)
, ( 'BBB', 'qqq', '2012-08-16', 210)
, ( 'BBB', 'ppp', '2012-08-16', 220)
, ( 'CCC', 'ppp', '2012-08-15', 300)
;

結果:

CREATE TABLE
INSERT 0 7
   zdate    | price_a | price_b | price_c 
------------+---------+---------+---------
 2012-08-15 |     100 |         |     300
 2012-08-15 |     110 |         |     300
 2012-08-15 |     120 |         |     300
 2012-08-16 |         |     200 |        
 2012-08-16 |         |     220 |        
(5 rows)

IFNULL/COALESCE 関数 (またはその他のフォーマットのトリビア) の追加は、読者の課題として残されています。

于 2012-09-05T11:48:51.947 に答える
0

StoredProcedureそのために作る

CREATE PROCEDURE [dbo].[GetMasterData]
   @startDate DATETIME,
   @endDate DATETIME
AS    
BEGIN
SET NOCOUNT ON;

WITH dates(Date) AS 
(
    SELECT @startdate as Date
    UNION ALL
    SELECT DATEADD(d,1,[Date])
    FROM dates 
    WHERE DATE < @enddate
)
SELECT Date as Date1  into #tmp1  FROM dates
OPTION (MAXRECURSION 0) 


Select Date1,IsNULL(Price, '------') AS Price  from #tmp1 left outer join
productHistory on  #tmp1.Date1 = productHistory.Date
and Company='AAA' AND Product='PPP'

Drop table #tmp1

END

以下の行を使用してspを実行します

exec GetMasterData '08/15/2012','08/19/2012'

于 2012-09-05T10:01:39.107 に答える