2016-09-12 2 views
0

を探して:誰かが説明することができ、私は、私の名前を提供するために、クエリを要求しなかったTSQL - これは私が使用し、その結果を以下に掲載されているコードであるコードの明確化

SELECT * 
FROM 
    (SELECT 
     P.ProductID, PC.Name, ISNULL (P.Color, 'uncolored') AS color 
    FROM 
     SalesLT.ProductCategory AS PC 
    JOIN 
     SalesLT.Product AS P ON PC.ProductCategoryID = P.ProductCategoryID 
) AS PPC 
PIVOT 
    (COUNT (ProductID) FOR Color IN ([Red],[Blue],[Silver],[Black],[Yellow],[Grey],[Multi],[Uncolored])) AS pvt 
ORDER BY 
    Name; 

Result

どのようにこの '名前'の事が結果にポップアップ?名前の代わりにProductIDを表示するには、コードを変更するにはどうすればよいですか?

ご意見やご感想をいただければ幸いです。

+3

- ああ**はい、そうでした!** SELECT ...、PC.Name、....が入っているサブクエリから 'SELECT *'を実行しています。これはあなたの 'Name'カラムです! – scrappedcola

+1

'でクエリ' SELECT P.ProductID、PC.Name'とあなたも順番にだ

PIVOT COUNT(Color) FOR Color IN ... 

+0

ORDER BY ProductIDを入力すると、次のエラーが表示されます。 無効な列名 'ProductID' – blackknight316

答えて

3

ProductIDは、テーブルをピボットするときに集約カラムとして使用したため表示されません。各色の製品IDの数だけが表示されます。表示するにはProductIDクエリのピボット部分を削除します。 Nameは、内部クエリに存在するため、最終結果に表示されます。

テーブルをピボットすると、行が列に変更されます。あなたのケースでは、赤、青、銀、黒、黄色、灰色、多色、無色(ピボットの句の内側にある)の色の行の値が列に変更されます。これらの各列の下に、その色の表にあるProductIDの数と '名前'列の名前が表示されます。したがって、クエリ内には個別のproductIdsが表示されません。 ProductID列の内部クエリは、カウントの計算にのみ使用され、最終結果には表示されません。

+0

私はあなたに任せていますが、私はまた、クエリの論理的な実装についても説明します。ピボット内でProductIDでグループ化したいのであれば、これはうまくいかないでしょう。 –

+0

@clifton_hさんが説明を追加しました。 –

2

PIVOTは、標準のSQL演算子でなくても、SQL Serverによって定義された演算子です。 PIVOTの演算子を使用せずにデータをどのようにピボットするのですか?それは簡単です。簡単にするために、ヌルカラーを無視してみましょう。

SELECT 
    P.ProductID, PC.Name, 
    COUNT(CASE WHEN P.Color = 'Red' THEN 1 END) AS Red, 
    COUNT(CASE WHEN P.Color = 'Blue' THEN 1 END) AS Blue, 
    ... 
FROM 
    SalesLT.ProductCategory AS PC 
JOIN 
    SalesLT.Product AS P ON PC.ProductCategoryID = P.ProductCategoryID 
GROUP BY P.ProductID, PC.Name; 

PIVOTは上記のクエリと全く同じ動作を行います。 PIVOT演算子にGROUP BY節を書く必要はないことに気付きました。その理由は、

(From Itzik Ben-Gan's T-SQL Fundamentals)

The PIVOT operator figures out the grouping elements implicitly by elimination. The grouping elements are all attributes from the source table that were not specified as either the spreading element or the aggregation element.

問題を解決するには、ProductId属性をPIVOT演算子の集約要素に入れないでください。 COUNTあなたのケースではどの属性も機能します。あなたは書くことができ

私は*私の名前を提供するために、クエリを要求しなかった*これはNAME`
関連する問題