SQL Server 2012 - 创建一个计算列,显示查询中的百分比

时间:2016-08-30 15:52:34

标签: sql sql-server tsql

我需要为报告创建一个查询,并捕获已填写的数据百分比并将其显示为计算列。

到目前为止,我已经使用连接编写了一个查询来获取所需的数据:

查询:

SELECT
    SU.ID,
    MAX(SU.[GenderID]), 
    MAX(SU.[TelephoneNumber]), 
    MAX(SU.[MobileNumber]), 
    MAX(SU.[AddressID]), 
    MAX(SU.[WebSite]), 
    MAX(SU.[Narrative]), 
    MAX(SU.[IndividualTitleID]), 
    MAX(SU.[DateOfBirth]),


    MAX(SUED.SystemUserID) AS [SUEDID],
    MAX(SUE.ID) AS [SUEID],
    MAX(SUQ.ID) AS [SUQID],
    MAX(SUPB.ID) AS [SUPB],
    MAX(SUPQ.ID) AS [SUPQID],
    MAX(SUPI1.ID) AS [Skill],
    MAX(SUPI2.ID) AS [Achievement],
    MAX(SUPI3.ID) AS [Interest]
FROM 
    [Employed].[SystemUser] SU
LEFT OUTER JOIN 
    [Profile].[SystemUserEducation] SUED ON SU.ID = SUED.SystemUserID
LEFT OUTER JOIN 
    [Profile].[SystemUserQualification] SUQ ON SUED.ID = SUQ.SystemUserEducationID
LEFT OUTER JOIN 
    [Profile].[SystemUserEmployment] SUE ON SU.ID = SUE.SystemUserID
LEFT OUTER JOIN 
    [Profile].[SystemUserProfessionalBody] SUPB ON SU.ID = SUPB.SystemUserID
LEFT OUTER JOIN 
    [Profile].[SystemUserProfessionalQualification] SUPQ ON SU.ID = SUPQ.SystemUserID
LEFT OUTER JOIN 
    [Profile].[SystemUserProfileItem] SUPI1 ON SU.ID = SUPI1.SystemUserID  AND SUPI1.SystemUserProfileItemTypeID = 1 -- Skills
LEFT OUTER JOIN 
    [Profile].[SystemUserProfileItem] SUPI2 ON SU.ID = SUPI2.SystemUserID  AND SUPI2.SystemUserProfileItemTypeID = 2 -- Achievement 
LEFT OUTER JOIN 
    [Profile].[SystemUserProfileItem] SUPI3 ON SU.ID = SUPI3.SystemUserID  AND SUPI3.SystemUserProfileItemTypeID = 3 -- Interest
WHERE
    SU.ID = 4604
GROUP BY
    SU.ID 

计算

上面的查询中有16列,我需要检查每列是否有数据,如果有数据然后分配1或者如果它是null则分配0。

一旦我得到了包含数据的列的总和,我就想执行这样的计算 - * 100 *已完成的列/总列* 然后我想将其显示为该查询的列。

基本上,这些数据将用于报告中。

关于如何在SQL中执行此操作的任何建议都很棒,谢谢

1 个答案:

答案 0 :(得分:1)

Select
SU.ID,
SU.[GenderID],
SU.[TelephoneNumber], 
SU.[MobileNumber], 
SU.[AddressID], 
SU.[WebSite],
SU.[Narrative], 
SU.[IndividualTitleID], 
SU.[DateOfBirth],


MAX(SUED.SystemUserID) AS [SUEDID],
MAX(SUE.ID) AS [SUEID],
MAX(SUQ.ID) AS [SUQID],
MAX(SUPB.ID) AS [SUPB],
MAX(SUPQ.ID) AS [SUPQID],
MAX(SUPI1.ID) AS [Skill],
MAX(SUPI2.ID) AS [Achievement],
MAX(SUPI3.ID) AS [Interest],

100 * (
    CASE WHEN MAX(SUED.SystemUserID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUE.ID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUQ.ID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUPB.ID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUPQ.ID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUPI1.ID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUPI2.ID) IS NULL THEN 0 ELSE 1 END
    + CASE WHEN MAX(SUPI3.ID) IS NULL THEN 0 ELSE 1 END
) / 8.0

FROM [Employed].[SystemUser] SU
LEFT OUTER JOIN [Profile].[SystemUserEducation] SUED ON SU.ID = SUED.SystemUserID
LEFT OUTER JOIN [Profile].[SystemUserQualification] SUQ ON SUED.ID = SUQ.SystemUserEducationID
LEFT OUTER JOIN [Profile].[SystemUserEmployment] SUE ON SU.ID = SUE.SystemUserID
LEFT OUTER JOIN [Profile].[SystemUserProfessionalBody] SUPB ON SU.ID = SUPB.SystemUserID
LEFT OUTER JOIN [Profile].[SystemUserProfessionalQualification] SUPQ ON SU.ID = SUPQ.SystemUserID
LEFT OUTER JOIN [Profile].[SystemUserProfileItem] SUPI1 ON SU.ID = SUPI1.SystemUserID  AND SUPI1.SystemUserProfileItemTypeID = 1 -- Skills
LEFT OUTER JOIN [Profile].[SystemUserProfileItem] SUPI2 ON SU.ID = SUPI2.SystemUserID  AND SUPI2.SystemUserProfileItemTypeID = 2 -- Achievement 
LEFT OUTER JOIN [Profile].[SystemUserProfileItem] SUPI3 ON SU.ID = SUPI3.SystemUserID  AND SUPI3.SystemUserProfileItemTypeID = 3 -- Interest

Where SU.ID = 4604
Group by
    SU.ID,
    SU.[GenderID],
    SU.[TelephoneNumber], 
    SU.[MobileNumber], 
    SU.[AddressID], 
    SU.[WebSite],
    SU.[Narrative], 
    SU.[IndividualTitleID], 
    SU.[DateOfBirth],