修改 T-SQL 查询以根据其他列值包含/排除列

时间:2021-02-27 13:35:21

标签: sql sql-server tsql

我有以下查询,我需要一些帮助修改。在下面的查询中,我得到不为空的列数和百分比:

SELECT COUNT(v.col) as num_not_null, COUNT(v.col) * 1.0 / COUNT(*) * 100 as percent_not_null, COUNT(*) as toltalColsNeedsFilled 
FROM EFP_EmploymentUser t 
CROSS APPLY (VALUES (t.ITAdvicedFirst), 
                    (t.ITAdvicedSecond), 
                    (t.ITDepartmentDone), 
                    (t.CFOAdvicedFirst), 
                    (t.CFOInfoProvided), 
                    (t.CFOAdvicedSecond), 
                    (t.CFODone), 
                    (t.EconomyAdviced), 
                    (t.EconomyDone), 
                    (t.AcademyAdviced), 
                    (t.AcademyDone), 
                    (t.PublicatorAdviced), 
                    (t.PublicatorDone), 
                    (t.PortraitAdviced), 
                    (t.PortraitDone), 
                    (t.WhoIsWhoAdviced), 
                    (t.WhoIsWhoDone), 
                    (t.BogportalAdviced), 
                    (t.BogportalDone), 
                    (t.KeyCardAdviced), 
                    (t.KeyCardDone) ) v(col) 
    WHERE ID = '19';

这在 ID 19 的情况下返回:

num_not_null    percent_not_null    toltalColsNeedsFilled
5               23.809523809500     21

但我需要检查同一个表(Publicator、Bogportal、Academy)中的以下列是否填充了值“yes”,并且根据我需要在上面的查询中包含或排除某些列:

i.e.: IF Academy = YES then include t.AcademyAdviced & t.AcademyDone
      IF Publicator= YES then include t.PublicatorDone & t.PortraitAdviced
      IF Bogportal = YES then include t.BogportalAdviced & t.BogportalDone

谁能帮我修改查询来实现这一点? :-)

最好的问候 斯蒂格

1 个答案:

答案 0 :(得分:1)

您可以使用 UNION ALLWHERE 谓词来决定将哪些列添加到逆透视:

SELECT COUNT(v.col) as num_not_null, COUNT(v.col) * 1.0 / COUNT(*) * 100 as percent_not_null, COUNT(*) as toltalColsNeedsFilled 
FROM EFP_EmploymentUser t 
CROSS APPLY (
    SELECT * FROM
           ( VALUES (t.ITAdvicedFirst), 
                    (t.ITAdvicedSecond), 
                    (t.ITDepartmentDone), 
                    (t.CFOAdvicedFirst), 
                    (t.CFOInfoProvided), 
                    (t.CFOAdvicedSecond), 
                    (t.CFODone), 
                    (t.EconomyAdviced), 
                    (t.EconomyDone), 
                    (t.PortraitAdviced), 
                    (t.PortraitDone), 
                    (t.WhoIsWhoAdviced), 
                    (t.WhoIsWhoDone), 
                    (t.KeyCardAdviced), 
                    (t.KeyCardDone) ) v(col)
    UNION ALL
    SELECT *
        FROM (VALUES (t.AcademyAdviced), (t.AcademyDone) ) v(col)
        WHERE t.Academy = 'YES'
    UNION ALL
    SELECT *
        FROM (VALUES (t.PublicatorDone), (t.PortraitAdviced) ) v(col)
        WHERE t.Publicator = 'YES'
    UNION ALL
    SELECT *
        FROM (VALUES (t.BogportalAdviced), (t.BogportalDone ) ) v(col)
        WHERE t.Bogportal = 'YES'
) v

WHERE t.ID = '19';
相关问题