Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据输入值将结果分成两列?SQL Server_Sql_Sql Server_Northwind - Fatal编程技术网

根据输入值将结果分成两列?SQL Server

根据输入值将结果分成两列?SQL Server,sql,sql-server,northwind,Sql,Sql Server,Northwind,我正在使用Nortwind数据库和SQL Server 2014,我尝试进行一个查询,以划分两个不同年份的订单结果,我希望在查询中使用的格式是 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

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

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
....
使用“条件聚合”

选择
ca.CategoryName
,总和(当年份(订单日期)=1996,则ot单价*ot数量结束时的情况)作为1996年的总计
,总和(当年份(订单日期)=1997,则ot单价*ot数量结束时的情况)作为1997年的总计
从命令
o.OrderID=ot.OrderID上的内部联接[Order Details]ot
ot.ProductID=pro.ProductID上的内部联接产品pro
pro.CategoryID=ca.CategoryID上的内部联接类别ca
其中o.OrderDate>='19960101'和o.OrderDate<'19980101'
分组
ca.CategoryName
订购人
ca.CategoryName
基本上,这意味着在聚合函数中使用case表达式

如果你想知道为什么我没有在where子句中使用“between”:参见

您可以使用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;

它工作得很好。如果我想添加更多的日期作为参数,我必须在“选择另一个案例”和“where truth?”中添加,为什么不在“where”中使用“year”呢?如果你想添加更多的列,那么你可以添加更多的案例或使用。@DarkFenix是的,你可以根据需要不断添加新的聚合列。别忘了调整“where”子句也要匹配。非常感谢您的帮助。Regard我喜欢这个解决方案,它很有效,但我接受了答案,因为我仍然不太理解它。问候,还有很多thanks@DarkFenixPivot查询帮助我们生成一个交互式表,该表可以快速组合和比较大量数据可以旋转其行和列以查看源数据的不同摘要,我们可以一目了然地显示感兴趣区域的详细信息。它还可以帮助我们生成多维报告。
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
 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;