2016-09-12 2 views
0

을 찾고 이것은 내가 사용하는 코드이며, 그 결과는 아래에 게시 어떻게이 '이름'이 결과에 나타 났습니까? ProductID을 이름 대신 표시하려면 어떻게해야합니까?TSQL 코드 설명

도움이나 의견을 보내 주시면 대단히 감사하겠습니다.

+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은 내부 쿼리에 있기 때문에 최종 결과에 표시됩니다.

테이블을 회전하면 행이 열로 변경됩니다. 귀하의 경우 Red, Blue, Silver, Black, Yellow, Gray, Multi, Uncolored (피벗 절 내부에 주어진대로)의 행 값이 열로 변경됩니다. 각 열 아래에서 해당 색의 테이블에있는 ProductID 수와 '이름'열의 이름이 표시됩니다. 따라서 쿼리에서 개별 제품 ID가 표시되지 않습니다. ProductID 열의 내부 쿼리는 계산 계산에만 사용되며 최종 결과에는 표시되지 않습니다.

+0

나는 당신에게 맡긴다. 그러나 나는 또한 질문의 논리적 구현을 ​​설명 할 것이다. 피벗 내부에서 ProductID로 그룹화하려는 경우 ... 잘 작동하지 않습니다. –

+0

@clifton_h가 설명을 추가했습니다. –

2

PIVOT은 표준 SQL 연산자가 아니더라도 SQL Server에서 정의한 연산자입니다. PIVOT 연산자없이 데이터를 피벗하려면 어떻게해야합니까? 그것은 간단합니다. 간단히하기 위해 null 색상을 무시합시다.

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`