简体   繁体   中英

SQL count across multiple columns in one table

I've been trying to get a count of a specific subset of a population based on a status ID (active) and a dependant type. Unfortunately, dependants are listed across multiple columns such as dependent 1, dependent 2, etc.

I tried to make use of a nested case statement and then summing the result:

select TOP (100) [Month],
    [SCHEME CODE DESCRIPTION],
    [MEMBER NUMBER],
    Sum(CASE
        WHEN ([DEPENDANT DEPENDANT- TYPE 2] in ('A','M','O','S') and [DEPENDANT STATUS 2] = 'Active')
        THEN 1 
        WHEN ([DEPENDANT DEPENDANT- TYPE 3] in ('A','M','O','S') and [DEPENDANT STATUS 3] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 4] in ('A','M','O','S') and [DEPENDANT STATUS 4] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 5] in ('A','M','O','S') and [DEPENDANT STATUS 5] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 6] in ('A','M','O','S') and [DEPENDANT STATUS 6] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 7] in ('A','M','O','S') and [DEPENDANT STATUS 7] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 8] in ('A','M','O','S') and [DEPENDANT STATUS 8] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 9] in ('A','M','O','S') and [DEPENDANT STATUS 9] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 10] in ('A','M','O','S') and [DEPENDANT STATUS 10] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 11] in ('A','M','O','S') and [DEPENDANT STATUS 11] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 12] in ('A','M','O','S') and [DEPENDANT STATUS 12] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 13] in ('A','M','O','S') and [DEPENDANT STATUS 13] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 14] in ('A','M','O','S') and [DEPENDANT STATUS 14] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 15] in ('A','M','O','S') and [DEPENDANT STATUS 15] = 'Active')
        THEN 1
        WHEN ([DEPENDANT DEPENDANT- TYPE 16] in ('A','M','O','S') and [DEPENDANT STATUS 16] = 'Active')
        THEN 1
        ELSE 0
    END) as NUM_ADULT_DEP
from [PROFMED].[dbo].[Members_Data]
group by [Month],
            [SCHEME CODE DESCRIPTION],
            [MEMBER NUMBER]
order by NUM_ADULT_DEP desc
;

The results returned is not correct as the it isn't doing the sum across the columns.

Data example:

数据

Expected result: 预期结果

Please assist :)

I believe you're trying to do this (basically I have broken down your one big case statement into fifteen and added them):

SUM(
      CASE WHEN [DEPENDANT DEPENDANT- TYPE 2]  IN ('A','M','O','S') AND [DEPENDANT STATUS 2]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 3]  IN ('A','M','O','S') AND [DEPENDANT STATUS 3]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 4]  IN ('A','M','O','S') AND [DEPENDANT STATUS 4]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 5]  IN ('A','M','O','S') AND [DEPENDANT STATUS 5]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 6]  IN ('A','M','O','S') AND [DEPENDANT STATUS 6]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 7]  IN ('A','M','O','S') AND [DEPENDANT STATUS 7]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 8]  IN ('A','M','O','S') AND [DEPENDANT STATUS 8]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 9]  IN ('A','M','O','S') AND [DEPENDANT STATUS 9]  = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 10] IN ('A','M','O','S') AND [DEPENDANT STATUS 10] = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 11] IN ('A','M','O','S') AND [DEPENDANT STATUS 11] = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 12] IN ('A','M','O','S') AND [DEPENDANT STATUS 12] = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 13] IN ('A','M','O','S') AND [DEPENDANT STATUS 13] = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 14] IN ('A','M','O','S') AND [DEPENDANT STATUS 14] = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 15] IN ('A','M','O','S') AND [DEPENDANT STATUS 15] = 'Active' THEN 1 ELSE 0 END
    + CASE WHEN [DEPENDANT DEPENDANT- TYPE 16] IN ('A','M','O','S') AND [DEPENDANT STATUS 16] = 'Active' THEN 1 ELSE 0 END
) AS NUM_ADULT_DEP

Having said that, it is a poor database design. You should create a separate table for dependents.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM