【问题标题】:sql server issue with UNION SQL使用 UNION SQL 的 sql 服务器问题
【发布时间】:2018-03-07 10:36:26
【问题描述】:

我的查询有问题。

Msg 205, Level 16, State 1, Line 5 所有查询使用 UNION 组合, INTERSECT 或 EXCEPT 运算符必须有相等数量的表达式 在他们的目标列表中。

我是基本用户(仍在学习 SQL)。

我在这里将几个选择组合在一起我的代码:

我想把类别放在 FCRR 旁边。

我尝试了很多组合但都失败了:(

感谢您的帮助,

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

【问题讨论】:

  • 错误信息很清楚。当 UNION 时,选择的列数必须相同。
  • 为所有联合包括category,将执行
  • ... 或添加 null,如果您不需要它
  • 谢谢B楼:)我是盲人。您的评论完成了工作:)
  • 你的尝试很好+1

标签: sql sql-server


【解决方案1】:

您好,B House 的评论帮助了我:)

解决办法:

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

【讨论】:

    【解决方案2】:

    您的第一个 SELECT 有 2 列,[FCRR] 和类别。您尝试 UNION ALL 的另外 2 个 SELECT 必须具有这 2 列(或至少具有相同的数据类型)。两者都缺少与 Category 列对应的那个。

    您可以通过添加默认的硬编码值 (SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR], 0 as Category) 或从数据表中实际选择它们(如果对应)来解决它。

    【讨论】:

      【解决方案3】:

      调试的第一条规则:简化问题。

      • 你有 3 个部分 UNIONed 在一起;首先尝试其中两个的组合,以减少您必须查看的数量。
      • 分别运行每个查询并查看它返回的列数。这就是错误消息中“目标列表中的表达式数量”的含义。
      • 从更简单的查询开始,了解您每次添加的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 2011-01-24
        • 1970-01-01
        • 2010-12-04
        相关资源
        最近更新 更多