没有Null值的动态数据透视表 [英] Dynamic Pivot without Null value

查看:97
本文介绍了没有Null值的动态数据透视表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是Northwind数据库中的动态交叉表查询:

This is a dynamic crosstab query in Northwind database:

DECLARE @COUNTRY NVARCHAR(MAX) ='', @COUNTRY2 NVARCHAR(MAX)

SELECT @COUNTRY = @COUNTRY + QUOTENAME(Country)+', '
FROM Customers
GROUP BY Country

SET @COUNTRY= LEFT(@COUNTRY, LEN(@COUNTRY)-1)

SET @COUNTRY2 = REPLACE(@COUNTRY, ',' , '+')

DECLARE @SQL NVARCHAR(MAX)

SET @SQL = 'SELECT * , '+@COUNTRY2+' AS TOTAL
           FROM (SELECT E.EmployeeID, E.LastName, 
                        ISNULL( OD.Quantity, 0)* ISNULL(OD.[UnitPrice],0) QU,
                        O.ShipCountry AS CO
                 FROM Orders O JOIN Employees E ON O.EmployeeID = E.EmployeeID
                      JOIN [dbo].[Order Details] OD ON OD.OrderID = O.OrderID) AS T
PIVOT(SUM(QU) FOR CO IN ('+@COUNTRY+')) AS PVT
ORDER BY 1'
EXEC(@SQL) 

我需要以将Null值替换为0的方式更改代码.

I need to change the code in a way that have Null values replaced by 0.

推荐答案

DECLARE @COUNTRY NVARCHAR(MAX) = '' ,
  @COUNTRY2 NVARCHAR(MAX);

SELECT  @COUNTRY = @COUNTRY + COALESCE(QUOTENAME(Country) + ', ', '')
FROM    Customers
WHERE   EXISTS ( SELECT *
                 FROM   [Orders] AS [o]
                 WHERE  o.[CustomerID] = Customers.[CustomerID] )
GROUP BY Country;

SET @COUNTRY = LEFT(@COUNTRY, LEN(@COUNTRY) - 1);

SET @COUNTRY2 = REPLACE(@COUNTRY, ',', '+');

DECLARE @SQL NVARCHAR(MAX);

SET @SQL = 'SELECT * , ' + @COUNTRY2 +
  ' AS TOTAL
           FROM (
           SELECT  oe.EmployeeID, oe.LastName, oe.ShipCountry AS CO,
        COALESCE(OD.Quantity * OD.UnitPrice, 0) AS QU
FROM    (
          SELECT  EmployeeID, LastName, ShipCountry
          FROM    (
                    SELECT DISTINCT
                            ShipCountry
                    FROM    Orders
                  ) o ,
                  Employees
        ) oe
LEFT JOIN Orders O ON O.EmployeeID = oe.EmployeeID AND
                  [oe].[ShipCountry] = [O].[ShipCountry]
LEFT JOIN [Order Details] OD ON OD.OrderID = O.OrderID 
           ) AS T
PIVOT(SUM(QU) FOR CO IN (' + @COUNTRY + ')) AS PVT
ORDER BY 1';

EXEC(@SQL); 

这篇关于没有Null值的动态数据透视表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆