2017-01-31 7 views
-1

У меня есть «матрица» Y и N, см. Изображение ниже, что Id lile - это изображение ниже того, где оно сглажено в 1 строку для каждого SID, отображающего все Y s на одной строке и Ns, как я, ORing данные в строках. Могу ли я сделать это в SQL Server?SQL Server: попытка сгладить «матрицу» в строке

enter image description here

enter image description here

вот мой оригинальный запрос

SELECT TERM_SID, 
    CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data' THEN 'Y' ELSE 'N' END AS 'PUBLIC', 
    CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data in aggregate' THEN 'Y' ELSE 'N' END as 'PUBLIC_AGGREGATE', 
    CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data' THEN 'Y' ELSE 'N' END as 'INTERNAL', 
    CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data in aggregate' THEN 'Y' ELSE 'N' END as 'INTERNAL_AGGREGATE', 
    CASE WHEN d2.DATA_CLASSIFICATION_DESC='Limited data' THEN 'Y' ELSE 'N' END as 'LIMITED', 
    CASE WHEN d2.DATA_CLASSIFICATION_DESC='Restricted data' THEN 'Y' ELSE 'N' END as 'RESTRICTED' 
    FROM [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION] d2 
    JOIN [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION_MAPPING] dm2 ON dm2.DATA_CLASSIFICATION_SID=d2.DATA_CLASSIFICATION_SID order by TERM_SID 

и как я пытался суммировать отдельные столбцы после преобразования 'Y' = 1 'N' = 0

select * from 
     (
     SELECT TERM_SID, 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data' THEN 1 ELSE 0 END AS 'PUBLIC', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data in aggregate' THEN 1 ELSE 0 END as 'PUBLIC_AGGREGATE', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data' THEN 1 ELSE 0 END as 'INTERNAL', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data in aggregate' THEN 1 ELSE 0 END as 'INTERNAL_AGGREGATE', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Limited data' THEN 1 ELSE 0 END as 'LIMITED', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Restricted data' THEN 1 ELSE 0 END as 'RESTRICTED' 
     FROM [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION] d2 
     JOIN [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION_MAPPING] dm2 ON dm2.DATA_CLASSIFICATION_SID=d2.DATA_CLASSIFICATION_SID 
    ) x 
     PIVOT 
     (sum (x.PUBLIC) for TERM_SID in (*)) as piv 

, но я получаю сообщение об ошибке x.PUBLIC см. Изображение ниже

enter image description here

Благодаря SqlZim вот что я придумал

select TERM_SID 
,max(PUBLICDATA) as PublicData 
,max(PUBLIC_AGGREGATE) as Public_AGGregate 
,max(INTERNAL) as Internal 
,max(INTERNAL_AGGREGATE) as internal_Aggregate 
,max(LIMITED) as Limited 
,max(RESTRICTED) as Restricted 
from 
(
     SELECT TERM_SID, 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data' THEN 'Y' ELSE 'N' END AS 'PUBLICDATA', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data in aggregate' THEN 'Y' ELSE 'N' END as 'PUBLIC_AGGREGATE', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data' THEN 'Y' ELSE 'N' END as 'INTERNAL', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data in aggregate' THEN 'Y' ELSE 'N' END as 'INTERNAL_AGGREGATE', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Limited data' THEN 'Y' ELSE 'N' END as 'LIMITED', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Restricted data' THEN 'Y' ELSE 'N' END as 'RESTRICTED' 
     FROM [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION] d2 
     JOIN [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION_MAPPING] dm2 ON dm2.DATA_CLASSIFICATION_SID=d2.DATA_CLASSIFICATION_SID 
) mat 
group by Term_SID 

также это работает, используя формат КТР предложил

with mat (TERM_SID,PUBLICDATA,PUBLIC_AGGREGATE,INTERNAL,INTERNAL_AGGREGATE,LIMITED,RESTRICTED) 
as 
(
     SELECT dm2.TERM_SID 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Public data' THEN 'Y' ELSE 'N' END AS PUBLICDATA 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Public data in aggregate' THEN 'Y' ELSE 'N' END as PUBLIC_AGGREGATE 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Internal data' THEN 'Y' ELSE 'N' END as INTERNAL 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Internal data in aggregate' THEN 'Y' ELSE 'N' END as INTERNAL_AGGREGATE 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Limited data' THEN 'Y' ELSE 'N' END as LIMITED 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Restricted data' THEN 'Y' ELSE 'N' END as RESTRICTED 
     FROM [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION] d2 
      JOIN [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION_MAPPING] dm2 
       ON dm2.DATA_CLASSIFICATION_SID = d2.DATA_CLASSIFICATION_SID 
) 
select m1.TERM_SID 
     ,max(m1.PUBLICDATA) as PublicData 
     ,max(m1.PUBLIC_AGGREGATE) as Public_AGGregate 
     ,max(m1.INTERNAL) as Internal 
     ,max(m1.INTERNAL_AGGREGATE) as internal_Aggregate 
     ,max(m1.LIMITED) as Limited 
     ,max(m1.RESTRICTED) as Restricted 
     ,count(1) as mat2count 
from mat m1 
    left join mat m2 
     on(m1.TERM_SID = m2.TERM_SID) 
group by m1.Term_SID 
+1

Что вы исследовали и опробовали перед публикацией здесь? – dfundako

+0

Я попытался использовать поворот и преобразовать «Y» и «N» в 0 и 1 ... stull, работая над этим, надеясь, что есть способ их ИЛИ –

ответ

2

Я не уверен, что происходит с два ряда для Term_SID=3 на втором изображении, но это подойдет ближе:

;with mat as (
    select 
     term_sid 
    , [Public] = case 
     when d2.data_classification_desc='Public data' 
      then 'Y' else 'N' end 
    , [Public_Aggregate] = case 
     when d2.data_classification_desc='Public data in aggregate' 
      then 'Y' else 'N' end 
    , [Internal] = case 
     when d2.data_classification_desc='Internal data' 
      then 'Y' else 'N' end 
    , [Internal_Aggregate] = case 
     when d2.data_classification_desc='Internal data in aggregate' 
      then 'Y' else 'N' end 
    , [Limited] = case 
     when d2.data_classification_desc='Limited data' 
      then 'Y' else 'N' end 
    , [Restricted] = case 
     when d2.data_classification_desc='Restricted data' 
      then 'Y' else 'N' end 
    from [udw_data_dictionary].[dbo].[data_classification] d2 
     join [udw_data_dictionary].[dbo].[data_classification_mapping] dm2 
     on dm2.data_classification_sid=d2.data_classification_sid 
) 

select 
     Term_SID 
    , Public    = max(Public) 
    , Public_Aggregate = max(Public_Aggregate) 
    , Internal   = max(Internal) 
    , Internal_Aggregate = max(Internal_Aggregate) 
    , Limited   = max(Limited) 
    , Restricted   = max(Restricted) 
    from mat 
    group by Term_SID 
    order by term_sid