簡體   English   中英

UNION SQL的SQL Server問題

[英]sql server issue with UNION SQL

我的查詢有問題。

消息205,級別16,狀態1,行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

您好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

您的第一個SELECT有2列,[FCRR]和Category。 您嘗試UNION ALL另外兩個SELECT必須具有此2列(或至少相同的數據類型)。 兩者都缺少與Category列對應的那個。

你可以通過添加一個默認的硬編碼值( SELECT cast(100 * ([FCRR] / CASESCOUNT) AS DECIMAL(5, 2)) AS [FCRR], 0 as Category )或實際從數據表中選擇它們來解決它,如果它對應。

調試的第一條規則:簡化問題。

  • 你有3個部分UNION編輯在一起; 首先嘗試其中兩個的組合,以重新計算您需要查看的金額。
  • 分別運行每個查詢並查看它返回的列數。 這是錯誤消息的意思是“目標列表中的表達式數量”。
  • 從簡單的查詢構建,了解每次添加的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM