56

我尝试在 PIVOT 函数中将(空)值转换为 0(零)输出,但没有成功。

下面是我尝试过的表格和语法:

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

我尝试使用ISNULL但没有用。

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

我需要使用什么语法?

4

7 回答 7

49
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
于 2012-09-07T16:57:28.880 回答
22

如果您在数据透视语句中使用动态列,则可以使用以下内容:

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
')
于 2015-07-08T16:11:59.390 回答
18

您不能IsNull()在选择数据之后放置直到,因此您将IsNull()在最终值周围放置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
于 2012-09-07T16:56:30.787 回答
3

有时最好像解析器一样思考,例如 T-SQL 解析器。在执行语句时,解析器在 Pivot 部分中没有任何值,并且您在该部分中不能有任何检查表达式。顺便说一句,您可以简单地使用它:

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
于 2012-09-07T16:57:59.760 回答
2

您必须考虑数据透视集中的所有值。您可以使用笛卡尔积来完成此操作。

select pivoted.*
from (
    select cartesian.key1, cartesian.key2, isnull(relationship.[value],'nullvalue') as [value]
    from (
      select k1.key1, k2.key2
      from ( select distinct key1 from relationship) k1
          ,( select distinct key2 from relationship) k2
    ) cartesian
      left outer join relationship on relationship.key1 = cartesian.key1 and  relationship.key2 = carterisan.key2
) data
  pivot (
    max(data.value) for ([key2_v1], [key2_v2], [key2_v3], ...)
  ) pivoted
于 2018-03-19T19:38:33.857 回答
0

我遇到了类似的问题。根本原因是(在我的情况下使用您的方案),在#temp 表中,没有以下记录:

一个。CLASS=RICE and STATE=TX
湾。CLASS=VEGIE和 (STATE=AZSTATE=CA)

因此,当 MSSQL 没有记录时,MSSQL 总是为 MAX、SUM、...(聚合函数)显示 NULL。

以上解决方案 (IsNull([AZ], 0)) 都不适合我,但我确实从这些解决方案中获得了一些想法。

抱歉,这真的取决于#TEMP 表。我只能提供一些建议。

  1. 确保#TEMP 表有以下条件的记录,即使数据为空。

    一个。CLASS=RICE 和 STATE=TX
    b. CLASS=VEGIE 和(STATE=AZ 或 STATE=CA)

    您可能需要使用笛卡尔积:select A.*, B.* from A, B

  2. 在 #temp 的选择查询中,如果您需要使用 WHERE 连接任何表,那么最好将 where 放在另一个子选择查询中。(目标是 1。)

  3. isnull(DATA, 0)在#TEMP 表中使用。

  4. 在进行支点之前,请确保您已实现目标 1。

我无法回答原始问题,因为#temp 表没有足够的信息。我在这里粘贴了我的代码作为示例。

SELECT * FROM (
            SELECT eeee.id as enterprise_id
            , eeee.name AS enterprise_name
            , eeee.indicator_name
            , CONVERT(varchar(12) , isnull(eid.[date],'2019-12-01') , 23) AS data_date
            , isnull(eid.value,0) AS indicator_value
            FROM (select ei.id as indicator_id, ei.name as indicator_name, e.* FROM tbl_enterprise_indicator ei, tbl_enterprise e) eeee                                             
            LEFT JOIN  (select * from tbl_enterprise_indicator_data WHERE [date]='2020-01-01') eid
                    ON  eeee.id = eid.enterprise_id and eeee.indicator_id = enterprise_indicator_id
        ) AS P 
        PIVOT 
        (
            SUM(P.indicator_value) FOR P.indicator_name IN(TX,CA)
        ) AS T 

于 2020-05-24T07:08:41.957 回答
0

要修改数据透视下的结果,您可以将列放在选定的字段中,然后相应地修改它们。可能您可以对使用数据透视函数构建的列使用 DECODE。

  • 克兰蒂
于 2018-05-28T21:26:26.087 回答