2015-09-26 4 views
2

Это динамический перекрестный запрос в базе данных Northwind:Dynamic Pivot без значения Null

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 * , '[email protected]+' 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 ('[email protected]+')) AS PVT 
ORDER BY 1' 
EXEC(@SQL) 

мне нужно изменить код таким образом, чтобы иметь нулевые значения заменяются на 0.

Result of the Query:

ответ

1
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); 
-1

Вам нужно изменить SELECT * к:

SELECT ISNULL(Argentina,0) AS 'Argentina' , INSNULL(Belgium,0) AS 'Belgium' , .... 

Of Конечно, вам нужно будет изменить свой динамический запрос, чтобы отразить функции ISNULL.

Good Luck

+0

Это много работы, что путь + это не решит его проблему замены NULLS с 0 для поворота (который, в свою очередь, вызывает общее быть NULL). –