根据输入值将结果分成两列? SQL 服务器

Divide results in two columns depending on the input values? SQL Server

我在 SQL Server 2014 中使用 Nortwind 数据库,我尝试进行查询以划分两个不同年份的订单结果,我在查询中想要的格式是

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-1998YEAR(o.OrderDate)

列中

我想得到例如

CategoryName | 1996 | 1997

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

使用“条件聚合”。

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

基本上这意味着在聚合函数中使用 case 表达式。

如果您想知道为什么我没有在 where 子句中使用“between”:请参阅 Bad habits to kick : mis-handling date / range queries

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

您可以使用 pivot 获得所需的输出

 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;