簡體   English   中英

子查詢只能返回 1 列

[英]Subquery can return 1 column only

此查詢的目的是根據今天的日期是工作日還是周末進行計算,並在 Union All 之后使用它,但是我得到了

消息 116 錯誤:
當不使用 EXISTS 引入子查詢時,選擇列表中只能指定一個表達式。

看起來我只能用這個返回 1 列:

我的查詢:

    SELECT (SELECT CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday')
        THEN
            (SELECT --WeekEND
                'X' AS Table_name
                ,CAST(MAX(date_1) as date) AS max_date
                ,DATEDIFF(DD,(CAST(MAX(date_1)as date)),GETDATE()) as NrOfDays

                ,CASE
                    WHEN DATEDIFF(DD,(CAST(MAX(date_1)as date)),GETDATE()) <= 3 THEN 'good'
                        ELSE 'bad'
                            END AS Status
                                    FROM [Table_1])
        ELSE
            (SELECT --WeekDAY
                'X' AS Table_name
                ,CAST(MAX(date_1) as date) AS max_date
                ,DATEDIFF(DD,(CAST(MAX(date_1)as date)),GETDATE()) as NrOfDays

                ,CASE
                    WHEN DATEDIFF(DD,(CAST(MAX(date_1)as date)),GETDATE()) <= 1 THEN 'good'
                        ELSE 'bad'
                            END AS Status
                                    FROM [Table_1])
        END
)

以下只是一個簡化版本的相同問題(如果我刪除“好”、“壞”部分,它會起作用):

SELECT (SELECT CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') THEN 
(SELECT 'Weekend', 'good')
ELSE
(SELECT 'Weekday', 'bad')
END
)

您正在嘗試將子查詢中的兩列返回到主查詢的單列中。

相反,您需要創建兩個(非常相似的)子查詢。 一個用於主查詢中的每一列。

SELECT( 
    SELECT(
        CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') THEN 
            (SELECT 'Weekend')
        ELSE
            (SELECT 'Weekday')
        END AS Column1,
        CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') THEN 
            (SELECT 'good')
        ELSE
            (SELECT 'bad')
        END AS Column2
    )
)

根據您的預期輸出,還有其他(更好的)方法可以做到這一點。 但這可能是最容易/最容易理解的。

此外,這並不重要,但您的查詢中有很多您並不真正需要的SELECT 以上可以簡化為:

SELECT
    CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') THEN 
        'Weekend'
    ELSE
        'Weekday'
    END AS Column1,
    CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') THEN 
        'good'
    ELSE
        'bad'
    END AS Column1

我不知道您的“狀態”列到底在做什么,所以我無法為您安全地優化它。 但我認為這應該做你想要的:

SELECT
    'X' AS Table_name,
    CAST(MAX(date_1) as date) AS max_date,
    DATEDIFF(DD,(CAST(MAX(date_1)as date)), GETDATE()) as NrOfDays,
    CASE WHEN DATENAME(weekday, GETDATE()) IN (N'Saturday', N'Sunday') THEN
        CASE WHEN DATEDIFF(DD,(CAST(MAX(date_1)as date)), GETDATE()) <= 3 THEN 
            'good'
        ELSE 
            'bad'
        END
    ELSE
        CASE WHEN DATEDIFF(DD,(CAST(MAX(date_1)as date)), GETDATE()) <= 1 THEN 
            'good'
        ELSE 
            'bad'
        END
    END AS Status
FROM [Table_1] 

暫無
暫無

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

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