目的:利用Northwind数据库的Orders,Order Details,Products表实现每一种产品按年月统计销售量,按产品名称和年月做标题显示。如下图所示:

sql行转列实例 

 

 1sql行转列实例--按年月统计
 2sql行转列实例DECLARE @StartYear int
 3sql行转列实例DECLARE @Year nvarchar(4)
 4sql行转列实例DECLARE @EndYear int
 5sql行转列实例DECLARE @Month int
 6sql行转列实例DECLARE @M nvarchar(2)
 7sql行转列实例DECLARE @SQl nvarchar(MAX)
 8sql行转列实例SET @SQL='SELECT OD.ProductID,ProductName'
 9sql行转列实例
10sql行转列实例SELECT @StartYear=DATENAME(YEAR,MIN(OrderDate)) FROM [Orders]
11sql行转列实例SELECT @EndYear=DATENAME(YEAR,MAX(OrderDate)) FROM [Orders]
12sql行转列实例
13sql行转列实例WHIlE(@StartYear<=@EndYear)
14sql行转列实例  BEGIN
15sql行转列实例    SET @Year=CAST(@StartYear AS varchar(4))
16sql行转列实例    SET @Month=1
17sql行转列实例    WHILE(@Month<13)
18sql行转列实例      BEGIN
19sql行转列实例        SET @M=right('0'+CAST(@Month as NVARCHAR(2)),2)
20sql行转列实例        SET @SQL=@SQL+',SUM(CASE WHEN (DATENAME(YEAR,OrderDate)='''+@Year+''' AND DATENAME(Month,OrderDate)='''+@M+''') THEN Quantity ELSE 0 END) as '''+@Year+'-'+@M+''''
21sql行转列实例        SET @Month=@Month+1
22sql行转列实例      END
23sql行转列实例
24sql行转列实例    SET @StartYear=@StartYear+1
25sql行转列实例  END
26sql行转列实例
27sql行转列实例SET @SQL=@SQL+' FROM Orders O LEFT OUTER JOIN [Order Details] OD ON O.OrderID=OD.OrderID'+
28sql行转列实例     ' LEFT JOIN [Products] P on OD.ProductID=P.ProductID '+
29sql行转列实例' GROUP BY OD.ProductID,ProductName ORDER BY OD.ProductID'
30sql行转列实例exec(@SQL)
31sql行转列实例print(@SQL)

 

 其实,这里最主要的代码是组合CASE语句,还可以考虑把第一个年份的前面月份和最后年份的后面月份去掉。随便也贴下代码:

 1sql行转列实例
 2sql行转列实例
 3sql行转列实例--按年月统计
 4sql行转列实例DECLARE @StartYear int
 5sql行转列实例DECLARE @Year nvarchar(4)
 6sql行转列实例DECLARE @EndYear int
 7sql行转列实例DECLARE @TmpYear int
 8sql行转列实例DECLARE @Month int,@Month1 int,@Month2 int
 9sql行转列实例DECLARE @MaxMonth int
10sql行转列实例DECLARE @M nvarchar(2)
11sql行转列实例DECLARE @SQl nvarchar(MAX)
12sql行转列实例SET @SQL='SELECT OD.ProductID,ProductName'
13sql行转列实例
14sql行转列实例SELECT @StartYear=DATENAME(YEAR,MIN(OrderDate)),@Month1=DATENAME(Month,MIN(OrderDate)) FROM [Orders]
15sql行转列实例SELECT @EndYear=DATENAME(YEAR,MAX(OrderDate)),@Month2=DATENAME(Month,MAX(OrderDate)) FROM [Orders]
16sql行转列实例
17sql行转列实例SET @TmpYear=@StartYear
18sql行转列实例
19sql行转列实例WHIlE(@TmpYear<=@EndYear)
20sql行转列实例  BEGIN
21sql行转列实例    SET @Year=CAST(@TmpYear AS varchar(4))
22sql行转列实例    SET @Month=1
23sql行转列实例    SET @MaxMonth=13
24sql行转列实例    IF(@TmpYear=@StartYear)
25sql行转列实例      SET @Month=@Month1
26sql行转列实例    ELSE IF(@TmpYear=@EndYear)
27sql行转列实例      SET @MaxMonth=@Month2+1
28sql行转列实例    WHILE(@Month<@MaxMonth)
29sql行转列实例      BEGIN
30sql行转列实例        SET @M=right('0'+CAST(@Month as NVARCHAR(2)),2)
31sql行转列实例        SET @SQL=@SQL+',SUM(CASE WHEN (DATENAME(YEAR,OrderDate)='''+@Year+''' AND DATENAME(Month,OrderDate)='''+@M+''') THEN Quantity ELSE 0 END) as '''+@Year+'-'+@M+''''
32sql行转列实例        SET @Month=@Month+1
33sql行转列实例      END
34sql行转列实例
35sql行转列实例    SET @TmpYear=@TmpYear+1
36sql行转列实例  END
37sql行转列实例
38sql行转列实例SET @SQL=@SQL+' FROM Orders O LEFT OUTER JOIN [Order Details] OD ON O.OrderID=OD.OrderID'+
39sql行转列实例     ' LEFT JOIN [Products] P on OD.ProductID=P.ProductID '+
40sql行转列实例' GROUP BY OD.ProductID,ProductName ORDER BY OD.ProductID'
41sql行转列实例exec(@SQL)
42sql行转列实例print(@SQL)
43sql行转列实例
44sql行转列实例
45sql行转列实例
46sql行转列实例

 

 

相关文章:

  • 2021-07-13
  • 2021-11-08
  • 2021-05-20
  • 2022-12-23
  • 2021-07-07
  • 2021-04-19
猜你喜欢
  • 2021-08-17
  • 2022-12-23
  • 2021-10-17
  • 2021-05-26
  • 2021-05-23
  • 2022-12-23
相关资源
相似解决方案