피벗에서 (null) 값을 출력 0으로 바꾸는 방법
피벗 기능에서 출력이 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
어떤 구문을 사용해야 합니까?
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
피벗 문에서 동적 열을 사용하는 경우 다음을 사용할 수 있습니다.
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
')
다음을 배치할 수 없습니다.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
때때로 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
피벗 세트의 모든 값을 고려해야 합니다.데카르트 제품을 사용하여 이 작업을 수행할 수 있습니다.
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
피벗 아래의 결과를 수정하려면 선택한 필드에 열을 넣은 다음 그에 따라 수정할 수 있습니다.피벗 기능을 사용하여 작성한 열에 대해 DECODE를 사용할 수 있습니다.
- 크란티 A
저도 비슷한 문제에 직면한 적이 있습니다.근본 원인은 #temp 테이블에 다음에 대한 기록이 없기 때문입니다.
a.CLASS=RICE and STATE=TX
b.CLASS=VEGIE
그리고 (STATE=AZ
또는STATE=CA
)
따라서 MSSQL이 레코드가 없는 경우 MSSQL은 항상 MAX, SUM, ...(집계 함수)에 대해 NULL을 표시합니다.
위의 솔루션(IsNull([AZ], 0)은 저에게 적합하지 않지만, 저는 이러한 솔루션에서 아이디어를 얻습니다.
죄송합니다. #TEMP 테이블에 따라 다릅니다.저는 몇 가지 제안만 할 수 있습니다.
#TEMP 테이블에 데이터가 null인 경우에도 아래 조건에 대한 레코드가 있는지 확인합니다.
클래스=밥 및 상태=밥
CLASS=VEGIE 및 (상태=AZ 또는 상태=CA)데카르트 제품을 사용해야 할 수도 있습니다.
select A.*, B.* from A, B
#temp에 대한 선택 쿼리에서 WHERE와 함께 테이블에 참여해야 하는 경우 다른 하위 선택 쿼리 내에 위치를 지정하는 것이 좋습니다(목표는 1).
사용하다
isnull(DATA, 0)
#TEMP 테이블에 있습니다.피벗하기 전에 목표 1을 달성했는지 확인합니다.
#temptable에 대한 정보가 부족하여 원래 질문에 대한 답변을 드릴 수 없습니다.여기에 예시로 코드를 붙여넣었습니다.
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
언급URL : https://stackoverflow.com/questions/12322342/how-to-replace-null-values-with-0-output-in-pivot
'programing' 카테고리의 다른 글
PL/SQL 스크립트 내부의 로컬 함수 (0) | 2023.06.28 |
---|---|
루비 문자열 내에서 문자열 "\n"을 제거하려면 어떻게 해야 합니까? (0) | 2023.06.28 |
Firebase에서 특정 사용자 삭제 (0) | 2023.06.28 |
Node.js의 이벤트 중심 방식은 무엇이 다릅니까?ASP에서는 그렇게 할 수 없나요?넷의 HttpAsyncHandler? (0) | 2023.06.28 |
Spring - server.connection-timeout이 작동하지 않습니다. (0) | 2023.06.28 |