2017-11-17 6 views
0

내가 SQL 서버 2014와 Nortwind 데이터베이스를 사용하고, 나는 내 쿼리에서 원하는 두 개의 서로 다른 년만에 주문의 결과를 나눌 수있는 쿼리 형식을 만들입력 값에 따라 결과를 두 개의 열로 나눕니까? SQL 서버

category |anio one | anio two 

어디 시도 몇 년이 열에서이 다른 년간 나에게 각 카테고리의 합계를 제공합니다 내가 지금까지 시도하는

SELECT ca.CategoryName , YEAR(o.OrderDate), SUM(ot.UnitPrice*ot.Quantity) as total 
FROM Orders o 
INNER JOIN [Order Details] ot ON O.OrderID = ot.OrderID 
INNER JOIN Products pro ON ot.ProductID = pro.ProductID 
INNER JOIN Categories ca ON pro.CategoryID = ca.CategoryID 
GROUP BY ca.CategoryName,YEAR(o.OrderDate) 
ORDER BY ca.CategoryName; 

입니다 1996-1997-1998 다를 수 있습니다 YEAR(o.OrderDate)

나는 예를

CategoryName | 1996 | 1997 

Beverages |53879,20 | 110424,00 
Condiments |19458,30 | 59679,00 
.... 

답변

4

사용 "조건부 집계를위한"싶어.

SELECT 
     ca.CategoryName 
    , SUM(case when year(o.OrderDate) = 1996 then ot.UnitPrice * ot.Quantity end) AS total_1996 
    , SUM(case when year(o.OrderDate) = 1997 then ot.UnitPrice * ot.Quantity end) AS total_1997 
FROM Orders o 
INNER JOIN [Order Details] ot ON o.OrderID = ot.OrderID 
INNER JOIN Products pro ON ot.ProductID = pro.ProductID 
INNER JOIN Categories ca ON pro.CategoryID = ca.CategoryID 
where o.OrderDate >= '19960101' and o.OrderDate < '19980101' 
GROUP BY 
     ca.CategoryName 
ORDER BY 
     ca.CategoryName 

기본적으로 이것은 집계 함수 내부의 사례 식을 사용한다는 의미입니다. 절 내가에 사이에 "사용하지 않은 이유를 궁금해하는

I의 경우 : Bad habits to kick : mis-handling date/range queries

+0

원하는 출력을 얻을 수 있습니다. 더 많은 날짜를 매개 변수로 추가하려면 다른 케이스를 선택하고 어디에서 진실을 추가해야합니까? 그리고 연도를 사용하지 않는 이유는 무엇입니까? – DarkFenix

+0

더 많은 열을 추가하려는 경우 추가 할 수 있습니다. 사례를 사용하거나 [동적 SQL] (https : //docs.mic rosoft.com/en-us/sql/odbc/reference/dynamic-sql). –

+0

@DarkFenix ​​예 필요한 경우 새 집계 열을 계속 추가 할 수 있습니다. 잊지 마세요뿐만 아니라 일치하도록 절을 조정하는 것을 잊지 마십시오. –

2
You can use PIVOT to get your desired Output 

BEGIN TRAN 
CREATE TABLE #Temp(CategoryName NVARCHAR(50),[Year]INT,TOTAL DECIMAL(15,2)) 

INSERT INTO #Temp 
SELECT ca.CategoryName , YEAR(o.OrderDate), SUM(ot.UnitPrice*ot.Quantity) as total 
FROM Orders o 
INNER JOIN [Order Details] ot ON O.OrderID = ot.OrderID 
INNER JOIN Products pro ON ot.ProductID = pro.ProductID 
INNER JOIN Categories ca ON pro.CategoryID = ca.CategoryID 
GROUP BY ca.CategoryName,YEAR(o.OrderDate) 
ORDER BY ca.CategoryName; 


SELECT * FROM #Temp 
GO 
select * 
from 
(
    select CategoryName, [Year], TOTAL 
    from #Temp 
) src 
pivot 
(
    sum(TOTAL) 
    for YEAR in ([1996], [1997] 
)) piv; 

ROLLBACK TRAN 
+0

나는 해결책을 좋아하고 그것은 작동하지만 나는 아직도 이것을 아주 잘 이해하지 못하기 때문에 피벗을 사용하지 않는 대답을 받아 들였다. 안녕하십니까. – DarkFenix

+0

@DarkFenix ​​피봇 쿼리는 대용량 데이터를 신속하게 결합하고 비교하는 대화식 테이블을 생성하는 데 도움이됩니다. 행과 열을 회전하여 소스 데이터의 다른 요약을 볼 수 있으며 관심 영역에 대한 세부 정보를 한눈에 표시 할 수 있습니다. 또한 다차원 보고서를 생성하는데도 도움이됩니다. –

2

당신이 피벗을 사용할 수 있습니다 볼은 완벽했다

CREATE TABLE #TEMP 
(
    Category VARCHAR(200), 
    YEAR1 NUMERIC, 
    Total MONEY 
) 

INSERT INTO #TEMP 
SELECT 'beverages', 1996, 500 
union 
SELECT 'beverages', 1997, 750 
union 
SELECT 'Condiments', 1997, 1000 
union 
SELECT 'Condiments', 1996, 800 


SELECT * 
FROM 
    (
     SELECT Category,YEAR1, Total FROM #TEMP 
    ) AS SourceTable 
PIVOT 
    (
     AVG(Total) FOR YEAR1 IN ([1996], [1997]) 
    ) AS PivotTable;