2012-09-07 86 views
22

Tôi đã cố gắng chuyển đổi (null) giá trị với 0 (số không) đầu ra trong chức năng PIVOT nhưng không có thành công.Làm thế nào để thay thế (null) giá trị với 0 đầu ra trong PIVOT

Dưới đây là bảng và cú pháp tôi đã cố gắng"

SELECT 
CLASS, 
[AZ], 
[CA], 
[TX] 
FROM #TEMP 
PIVOT (SUM(DATA) 
FOR STATE IN ([AZ], [CA], [TX])) AS PVT 
ORDER BY CLASS 

CLASS AZ CA  TX 
RICE 10 4  (null) 
COIN 30 3  2 
VEGIE (null) (null) 9 

tôi cố gắng sử dụng ISNULL nhưng đã không làm việc.

PIVOT SUM(ISNULL(DATA,0)) AS QTY 

thể ai đó hãy nhìn vào lỗi cú pháp của nó?

Trả lời

30
SELECT CLASS, 
isnull([AZ],0), 
isnull([CA],0), 
isnull([TX],0) 
FROM #TEMP 
PIVOT (SUM(DATA) 
FOR STATE IN ([AZ], [CA], [TX])) AS PVT 
ORDER BY CLASS 
+6

này không luôn luôn làm việc . Khi có sự khác biệt về số lượng bản ghi, trục tạo ra 'ô' mới có thể là NULL. Một giải pháp nên phục vụ cho kịch bản đó. – greenafrican

+0

Bạn có thể thêm một số giải thích cho câu trả lời này không? –

11

Bạn không thể đặt IsNull() cho đến sau khi dữ liệu được chọn để bạn sẽ đặt IsNull() xung quanh valu cuối cùng e trong SELECT:

SELECT CLASS, 
    IsNull([AZ], 0) as [AZ], 
    IsNull([CA], 0) as [CA], 
    IsNull([TX], 0) as [TX] 
FROM #TEMP 
PIVOT 
(
    SUM(DATA) 
    FOR STATE IN ([AZ], [CA], [TX]) 
) AS PVT 
ORDER BY CLASS 
3

Đôi khi nó tốt hơn để suy nghĩ như một phân tích cú pháp, như phân tích cú pháp của T-SQL. Trong khi thực thi câu lệnh, trình phân tích cú pháp không có bất kỳ giá trị nào trong phần Pivot và bạn không thể có bất kỳ biểu thức kiểm tra nào trong phần đó. Bằng cách này, bạn chỉ có thể sử dụng này:

SELECT CLASS 
, IsNull([AZ], 0) 
, IsNull([CA], 0) 
, IsNull([TX], 0) 
    FROM #TEMP 
    PIVOT (
     SUM(DATA) 
     FOR STATE IN (
      [AZ] 
     , [CA] 
     , [TX] 
     ) 
    ) AS PVT 
    ORDER BY CLASS 
11

Nếu bạn có một tình huống mà bạn đang sử dụng các cột năng động trong bản Tuyên Bố trục của bạn, bạn có thể sử dụng như sau:

DECLARE @cols    NVARCHAR(MAX) 
DECLARE @colsWithNoNulls NVARCHAR(MAX) 
DECLARE @query    NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(Name) 
      FROM Hospital 
      WHERE Active = 1 AND StateId IS NOT NULL 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @colsWithNoNulls = STUFF(
      (
       SELECT distinct ',ISNULL(' + QUOTENAME(Name) + ', ''No'') ' + QUOTENAME(Name) 
       FROM Hospital 
       WHERE Active = 1 AND StateId IS NOT NULL 
       FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

EXEC (' 
     SELECT Clinician, ' + @colsWithNoNulls + ' 
     FROM 
     (
      SELECT DISTINCT p.FullName AS Clinician, h.Name, CASE WHEN phl.personhospitalloginid IS NOT NULL THEN ''Yes'' ELSE ''No'' END AS HasLogin 
      FROM Person p 
      INNER JOIN personlicense pl ON pl.personid = p.personid 
      INNER JOIN LicenseType lt on lt.licensetypeid = pl.licensetypeid 
      INNER JOIN licensetypegroup ltg ON ltg.licensetypegroupid = lt.licensetypegroupid 
      INNER JOIN Hospital h ON h.StateId = pl.StateId 
      LEFT JOIN PersonHospitalLogin phl ON phl.personid = p.personid AND phl.HospitalId = h.hospitalid 
      WHERE ltg.Name = ''RN'' AND 
       pl.licenseactivestatusid = 2 AND 
       h.Active = 1 AND 
       h.StateId IS NOT NULL 
     ) AS Results 
     PIVOT 
     (
      MAX(HasLogin) 
      FOR Name IN (' + @cols + ') 
     ) p 
') 
+0

Không đẹp nhưng công việc, tôi cũng phải thêm một bí danh cột! * rùng mình * – Shaun

Các vấn đề liên quan