2017-08-23 11 views
2

私は、アイテムコード、説明リリース日と必要数量を含むショップオーダーテーブルを持っています。 [ReleaseDate]のYear + Monthを使用して結果をピボットテーブル形式でピボットテーブル形式でクエリして、最も古い日付から最新の日付にソートする方法。 Year + Monthを列として使用する。SQL Serverのピボットとソート

これは私のクエリですが失敗します。

--Declare necessary variables 
DECLARE @SQLQuery AS NVARCHAR(MAX) 
DECLARE @PivotColumns AS NVARCHAR(MAX) 

--Get unique values of pivot column 
SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME([YEARMONTH]) 
FROM (SELECT DISTINCT CONVERT(char(6), cast([releaseddate] as date), 112) as [YEARMONTH] FROM [dbo].[ShopOrder]) as PivotQuery 

SELECT @PivotColumns 

--Create the dynamic query with all the values for 
--pivot column at runtime 

SET @SQLQuery = 
    N'SELECT ItemCode, ' + @PivotColumns + ' 
    FROM [dbo].[ShopOrder] 
    PIVOT(SUM(RequiredQty) 
      FOR [releaseddate] IN (' + @PivotColumns + ')) AS P' 

SELECT @SQLQuery 
--Execute dynamic query 
EXEC sp_executesql @SQLQuery 

これは、元のレコード

image

結果クエリは、この

image

+0

代わりの画像、テキスト形式のサンプルデータを共有してください、それはデバッグに以前だと提供あらゆる問題に対する迅速な解決策再。 –

+0

はい、申し訳ありません。私はスタックオーバーフロー時の新機能です。私はデータを貼り付けるのが難しいです。私は別のフォーマットを試してみました。 –

+0

問題はありません、データを貼り付けてください、私たちはそれをフォーマットしようとします。 –

答えて

1

のようにあなたが正しくピボットされていないする必要があり、列名がAで生成されるべきです単一の文字列。これを試してください:

CREATE TABLE ShopOrder (ItemCode VARCHAR(100),[Description] VARCHAR(100),ReleaseDate DATE, RequiredQty INT) 
GO 
INSERT INTO ShopOrder 
VALUES 
('A','SLEEVE NUT','08/01/2017',19200) 
,('A','SLEEVE NUT','08/02/2017',18000) 
,('A','SLEEVE NUT','09/01/2017',17000) 
,('B','STARTER','08/03/2017',10000) 
,('B','STARTER','08/04/2017',18000) 
,('B','STARTER','09/15/2017',16000) 

DECLARE @SQLQuery AS NVARCHAR(MAX) 
DECLARE @PivotColumns AS NVARCHAR(MAX) 

SET @PivotColumns = STUFF((SELECT DISTINCT ',[' + CONVERT(char(6), cast(ReleaseDate as date), 112) + ']' 
          FROM ShopOrder 
          ORDER BY ',[' + CONVERT(char(6), cast(ReleaseDate as date), 112) + ']' 
          FOR XML PATH('')),1,1,'') 

SET @SQLQuery = 
N' 
SELECT ItemCode,'+ @PivotColumns + ' 
FROM (SELECT ItemCOde,CONVERT(char(6), cast(ReleaseDate as date),112) ReleaseDate, RequiredQty 
     FROM ShopOrder) AS T 
PIVOT(SUM(RequiredQty) 
     FOR ReleaseDate IN ('[email protected]+')) AS P 
' 

SELECT @SQLQuery 
--Execute dynamic query 
EXEC sp_executesql @SQLQuery 
+0

コメントありがとうございました。私は私のクエリでいくつかの改良を加え、あなたと同じ結果を得ました。 –

1

ここでは、提供されたデータでピボットを実行しようとしました。

クエリ

Select 
    [ItemCode], 
    [Description], 
    [2017/8], 
    [2017/9] 
from 
(
select cast(year(ReleasedDate) as nvarchar)+'/'+cast(month(ReleasedDate) as nvarchar) as ReleasedDate,ItemCode,Description,RequiredQty 
from shoporder) as PivotData 
Pivot 
(
sum(RequiredQty) for ReleasedDate in 
([2017/8],[2017/9])) as Pivoting 
order by ItemCode 

出力:

enter image description here

Fiddle

+1

ありがとうshishir、これは多くの助けになります。 –

関連する問題