Mirosław Gądek
Mirosław Gądek

Reputation: 128

sql server issue with UNION SQL

I have an issue with my query.

Msg 205, Level 16, State 1, Line 5 All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.

I'm basic user (still learning SQL).

I have combined few Selects together here my code:

I want to get beside of FCRR the Category.

I have tried many combinations but failed :(

Thank you for your help,

SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR]
    ,CATEGORY
FROM (
    SELECT cast(count(*) AS DECIMAL(5, 2)) AS [FCRR]
        ,'1 Time' AS [CATEGORY]
        ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH_NAME]
        ,MONTH([TICKET_CLOSED]) AS [MONTH_NUMBER]
        ,YEAR([TICKET_CLOSED]) AS [YEARS]
    FROM [PL_Survey]
    WHERE [QUESTION6] = '1 Time' AND MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
    GROUP BY Month([TICKET_CLOSED])
        ,YEAR([TICKET_CLOSED])
        ,DATENAME(MONTH, [TICKET_CLOSED])
    ) AS T1
    ,(
        SELECT cast(count(*) AS DECIMAL(5, 2)) AS CASESCOUNT
            ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH NAME]
            ,MONTH([TICKET_CLOSED]) AS [MONTH]
            ,YEAR([TICKET_CLOSED]) AS [YEAR]
        FROM [PL_Survey]
        WHERE MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
        GROUP BY Month([TICKET_CLOSED])
            ,YEAR([TICKET_CLOSED])
            ,DATENAME(MONTH, [TICKET_CLOSED])
        ) AS T2

UNION ALL

SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR]
FROM (
    SELECT cast(count(*) AS DECIMAL(5, 2)) AS [FCRR]
        ,'2-3 Times' AS [CATEGORY]
        ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH_NAME]
        ,MONTH([TICKET_CLOSED]) AS [MONTH_NUMBER]
        ,YEAR([TICKET_CLOSED]) AS [YEARS]
    FROM [PL_Survey]
    WHERE [QUESTION6] = '2-3 Times' AND MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
    GROUP BY Month([TICKET_CLOSED])
        ,YEAR([TICKET_CLOSED])
        ,DATENAME(MONTH, [TICKET_CLOSED])
    ) AS T1
    ,(
        SELECT cast(count(*) AS DECIMAL(5, 2)) AS CASESCOUNT
            ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH NAME]
            ,MONTH([TICKET_CLOSED]) AS [MONTH]
            ,YEAR([TICKET_CLOSED]) AS [YEAR]
        FROM [PL_Survey]
        WHERE MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
        GROUP BY Month([TICKET_CLOSED])
            ,YEAR([TICKET_CLOSED])
            ,DATENAME(MONTH, [TICKET_CLOSED])
        ) AS T2

UNION ALL

SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR]
FROM (
    SELECT cast(count(*) AS DECIMAL(5, 2)) AS [FCRR]
        ,'More than 3 Times' AS [CATEGORY]
        ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH_NAME]
        ,MONTH([TICKET_CLOSED]) AS [MONTH_NUMBER]
        ,YEAR([TICKET_CLOSED]) AS [YEARS]
    FROM [PL_Survey]
    WHERE [QUESTION6] = 'More than 3 Times' AND MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
    GROUP BY Month([TICKET_CLOSED])
        ,YEAR([TICKET_CLOSED])
        ,DATENAME(MONTH, [TICKET_CLOSED])
    ) AS T1
    ,(
        SELECT cast(count(*) AS DECIMAL(5, 2)) AS CASESCOUNT
            ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH NAME]
            ,MONTH([TICKET_CLOSED]) AS [MONTH]
            ,YEAR([TICKET_CLOSED]) AS [YEAR]
        FROM [PL_Survey]
        WHERE MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
        GROUP BY Month([TICKET_CLOSED])
            ,YEAR([TICKET_CLOSED])
            ,DATENAME(MONTH, [TICKET_CLOSED])
        ) AS T2

Upvotes: 1

Views: 286

Answers (3)

EzLo
EzLo

Reputation: 14189

Your first SELECT has 2 columns, [FCRR] and Category. The 2 other SELECT that you are trying to UNION ALL must have this 2 columns (or at least the same data type). Both are missing the one corresponding to the Category column.

You can solve it by adding a default hard-coded value (SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR], 0 as Category) or actually selecting them from your data tables, if it corresponds.

Upvotes: 1

Mirosław Gądek
Mirosław Gądek

Reputation: 128

Hello the comment from B House helped me :)

Here the solution:

SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR]
    ,CATEGORY
FROM (
    SELECT cast(count(*) AS DECIMAL(5, 2)) AS [FCRR]
        ,'1 Time' AS [CATEGORY]
        ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH_NAME]
        ,MONTH([TICKET_CLOSED]) AS [MONTH_NUMBER]
        ,YEAR([TICKET_CLOSED]) AS [YEARS]
    FROM [PL_Survey]
    WHERE [QUESTION6] = '1 Time' AND MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
    GROUP BY Month([TICKET_CLOSED])
        ,YEAR([TICKET_CLOSED])
        ,DATENAME(MONTH, [TICKET_CLOSED])
    ) AS T1
    ,(
        SELECT cast(count(*) AS DECIMAL(5, 2)) AS CASESCOUNT
            ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH NAME]
            ,MONTH([TICKET_CLOSED]) AS [MONTH]
            ,YEAR([TICKET_CLOSED]) AS [YEAR]
        FROM [PL_Survey]
        WHERE MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
        GROUP BY Month([TICKET_CLOSED])
            ,YEAR([TICKET_CLOSED])
            ,DATENAME(MONTH, [TICKET_CLOSED])
        ) AS T2

UNION ALL

SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR]
,CATEGORY
FROM (
    SELECT cast(count(*) AS DECIMAL(5, 2)) AS [FCRR]
        ,'2-3 Times' AS [CATEGORY]
        ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH_NAME]
        ,MONTH([TICKET_CLOSED]) AS [MONTH_NUMBER]
        ,YEAR([TICKET_CLOSED]) AS [YEARS]
    FROM [PL_Survey]
    WHERE [QUESTION6] = '2-3 Times' AND MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
    GROUP BY Month([TICKET_CLOSED])
        ,YEAR([TICKET_CLOSED])
        ,DATENAME(MONTH, [TICKET_CLOSED])
    ) AS T1
    ,(
        SELECT cast(count(*) AS DECIMAL(5, 2)) AS CASESCOUNT
            ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH NAME]
            ,MONTH([TICKET_CLOSED]) AS [MONTH]
            ,YEAR([TICKET_CLOSED]) AS [YEAR]
        FROM [PL_Survey]
        WHERE MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
        GROUP BY Month([TICKET_CLOSED])
            ,YEAR([TICKET_CLOSED])
            ,DATENAME(MONTH, [TICKET_CLOSED])
        ) AS T2

UNION ALL

SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR]
,CATEGORY
FROM (
    SELECT cast(count(*) AS DECIMAL(5, 2)) AS [FCRR]
        ,'More than 3 Times' AS [CATEGORY]
        ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH_NAME]
        ,MONTH([TICKET_CLOSED]) AS [MONTH_NUMBER]
        ,YEAR([TICKET_CLOSED]) AS [YEARS]
    FROM [PL_Survey]
    WHERE [QUESTION6] = 'More than 3 Times' AND MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
    GROUP BY Month([TICKET_CLOSED])
        ,YEAR([TICKET_CLOSED])
        ,DATENAME(MONTH, [TICKET_CLOSED])
    ) AS T1
    ,(
        SELECT cast(count(*) AS DECIMAL(5, 2)) AS CASESCOUNT
            ,DATENAME(MONTH, [TICKET_CLOSED]) AS [MONTH NAME]
            ,MONTH([TICKET_CLOSED]) AS [MONTH]
            ,YEAR([TICKET_CLOSED]) AS [YEAR]
        FROM [PL_Survey]
        WHERE MONTH([TICKET_CLOSED]) = @MONTH AND [SUPPORT_GROUP] IN (@SUPPORT_GROUP)
        GROUP BY Month([TICKET_CLOSED])
            ,YEAR([TICKET_CLOSED])
            ,DATENAME(MONTH, [TICKET_CLOSED])
        ) AS T2

Upvotes: 2

IMSoP
IMSoP

Reputation: 97668

The first rule of debugging: simplify the problem.

  • You have 3 parts UNIONed together; try combinations of just two of them first, to reduec the amount you have to look at.
  • Run each query separately and see how many columns it returns. This is what the error message means by "number of expressions in their target lists".
  • Build up from simpler queries, understanding what you're adding each time.

Upvotes: 0

Related Questions