2017-10-23 4 views
0

나는 SQL 서버에서 다음 쿼리를 사용하여 피벗 테이블을 만들어 2016 년SQL 서버 2016 병합 행

WITH PivotData AS 
(
select [T_Spec_Char].[ID], 
    format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT, 
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM, 
    [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], 
    cast([T_Sample].[Value] as float) as Val 
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID] 
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value] 
) 

SELECT 
    DT, 
    TM, 
    [Line], 
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
ORDER BY DT, TM 

결과는 다음과 같습니다

DT   TM   Line Zone1Temp Zone2Temp Zone3Temp 
07/02/2017 01:21:55 Line2 310  NULL  NULL 
07/02/2017 01:21:55 Line2 NULL  330  NULL 
07/02/2017 01:21:55 Line2 NULL  NULL  345 
07/02/2017 01:51:56 Line2 310  NULL  NULL 
07/02/2017 01:51:57 Line2 NULL  330  NULL 
07/02/2017 01:51:57 Line2 NULL  NULL  345 
07/02/2017 02:21:56 Line2 310  NULL  NULL 
07/02/2017 02:21:56 Line2 NULL  330  NULL 
07/02/2017 02:21:56 Line2 NULL  NULL  345 
07/02/2017 02:51:56 Line2 310  NULL  NULL 
07/02/2017 02:51:56 Line2 NULL  330  NULL 
07/02/2017 02:51:56 Line2 NULL  NULL  345 
07/02/2017 03:21:56 Line2 310  NULL  NULL 
07/02/2017 03:21:56 Line2 NULL  330  NULL 
07/02/2017 03:21:58 Line2 NULL  NULL  345 
07/02/2017 03:51:56 Line2 310  NULL  NULL 
07/02/2017 03:51:57 Line2 NULL  330  NULL 
07/02/2017 03:51:57 Line2 NULL  NULL  345 

가 어떻게 병합 것 위 쿼리 결과의 첫 번째 3 행과 같은 날짜 및 시간을 가진 행을 한 행으로?

@Noxthron.

DT   TM   Line Temp 
07/02/2017 01:21:55 Line2 310 
07/02/2017 01:21:55 Line2 330 
07/02/2017 01:21:55 Line2 345 
07/02/2017 01:51:56 Line2 310 

I would like to be able to see: 
DT   TM   Line Zone1Temp Zone2Temp Zone3Temp 
07/02/2017 01:21:55 Line2 310  330  345 
+0

데이터 또는 쿼리 결과를 표시하는 이미지를 사용하지 마십시오. – STLDeveloper

+1

STLDeveloper, 이미지 변화 –

+1

.... 제발 암시 적 조인 구문 (쉼표로 구분 된'FROM' 절)에서 명시 적으로 조인과 조건을 나열하는 것으로 전환하십시오. 어떤 항목이 어떤 테이블에 속하는지 'WHERE' 절은 주로'FROM' 절의 테이블에 대한 기본 필터링에 사용되어야하며, 그 것입니다.)'SELECT'의 모든 열을 기준으로 그룹화하면 실제로는 'DISTINCT'를 의미합니다. 어디에서 중복이 대신오고 대신 중지합니다. –

답변

0

CTE에서 ID을 제거하십시오. PIVOT는 ID에 그룹화하면 행이 분리 유지합니다. "FOR 열 본질적으로"총과를 제외하고 GROUP BY 모든 열 "입니다.

WITH PivotData AS 
(
select format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT, 
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM, 
    [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], 
    cast([T_Sample].[Value] as float) as Val 
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID] 
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value] 
) 

SELECT 
    DT, 
    TM, 
    [Line], 
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
ORDER BY DT, TM 
0

테스트하지하지만 당신은 그룹에 해당 행을 같은 것을 사용해야합니다 : 귀하의 질의는 다음을 얻을 수

SELECT 
    DT, 
    TM, 
    [Line], 
    COALESCE(Zone1Temp, Zone2Temp, Zone3Temp) AS Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
GROUP BY DT, TM, [Line], COALESCE(Zone1Temp, Zone2Temp, Zone3Temp) 
ORDER BY DT, TM 
0

가장 쉬운 방법은 당신의 PivotData의 CTE에서 ID를 제거하는 것입니다

WITH PivotData AS 
(
select -- remove this field [T_Spec_Char].[ID], 
    format([T_Sample].[TimeStamp], 'dd/MM/yyyy') as DT, 
    format([T_Sample].[TimeStamp], 'hh:mm:ss') as TM, 
    [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], 
    cast([T_Sample].[Value] as float) as Val 
from [ABC].[dbo].[T_Spec_Char], [ABC].[dbo].[T_Sample], [ABC].[dbo].[T_Spec] 
where [T_Sample].[Spec_Char_ID] = [T_Spec_Char].[ID] and 
    ([T_Spec_Char].[Spec_Char] = 'Zone1Temp' or [T_Spec_Char].[Spec_Char] = 'Zone2Temp' 
    or [T_Spec_Char].[Spec_Char] = 'Zone3Temp') 
    and [T_Sample].[Spec_ID] = [T_Spec].[ID] 
group by [T_Spec_Char].[ID], [T_Sample].[TimeStamp], [T_Spec_Char].[Spec_Char], 
    [T_Spec].[Line], [T_Sample].[Value] 
) 

SELECT 
    DT, 
    TM, 
    [Line], 
    Zone1Temp, 
    Zone2Temp, 
    Zone3Temp 
FROM PivotData 
PIVOT 
(
    SUM(Val) 
    FOR Spec_Char 
    IN (Zone1Temp, Zone2Temp, Zone3Temp) 
) AS PivotResult 
ORDER BY DT, TM