56

PIVOT関数で出力が0(ゼロ)の(null)値を変換しようとしましたが、成功しませんでした。

以下は、私が試した表と構文です。

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パーサーのように、パーサーのように考える方がよい場合もあります。ステートメントの実行中、パーサーはピボットセクションに値を持たず、そのセクションにチェック式を含めることはできません。ちなみに、あなたはこれを簡単に使うことができます:

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

ピボットの下で結果を変更するには、選択したフィールドに列を配置し、それに応じて変更します。ピボット関数を使用して作成した列にDECODEを使用できる可能性があります。

  • クランティA
于 2018-05-28T21:26:26.087 に答える
0

同様の問題が発生しました。根本的な原因は(私の場合はシナリオを使用してください)、#tempテーブルに次のレコードがないことです。

a。CLASS=RICE and STATE=TX
b。CLASS=VEGIEおよび(STATE=AZまたはSTATE=CA

したがって、MSSQLがレコードなしでピボットする場合、MSSQLはMAX、SUM、...(集計関数)に対して常にNULLを表示します。

上記の解決策(IsNull([AZ]、0))はどれも私には機能しませんが、これらの解決策からアイデアを得ることができます。

申し訳ありませんが、それは本当に#TEMPテーブルに依存します。私はいくつかの提案しか提供できません。

  1. データがnullであっても、#TEMPテーブルに以下の条件のレコードがあることを確認してください。

    a。CLASS=RICEおよびSTATE=TXb
    。CLASS = VEGIEおよび(STATE=AZまたはSTATE=CA)

    デカルト積を使用する必要がある場合があります。select A.*, B.* from A, B

  2. #tempのselectクエリで、WHEREを使用してテーブルを結合する必要がある場合は、別のsubselectクエリ内のどこに配置するかをお勧めします。(目標は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 に答える