Только одно выражение может быть указано в списке выбора, если подзапрос не введен с EXISTS - PullRequest
0 голосов
/ 29 июня 2011

Я опубликовал Google и StackOverflow, прежде чем опубликовать это. По этому делу есть много постов, но я не могу найти проблему в моем запросе.

    DECLARE @hipero_a int
SET @hipero_a = 1

SELECT
CASE @hipero_a 
WHEN 1 THEN --month
    (
    SELECT Year(o.AccomplishDate) AS [Rok], Month(o.AccomplishDate) AS [Miesiąc], SUM(oi.Price) AS [Przychód]
    FROM Orders o JOIN OrdersItems oi ON oi.OrderId = o.Id
    WHERE o.State = 0
    GROUP BY Year(o.AccomplishDate), Month(o.AccomplishDate)
    --ORDER BY Year(o.AccomplishDate), Month(o.AccomplishDate) ASC
)
WHEN 2 THEN --year
    (
    SELECT Year(o.AccomplishDate) AS [Rok], SUM(oi.Price) AS [Przychód]
    FROM Orders o JOIN OrdersItems oi ON oi.OrderId = o.Id
    WHERE o.State = 0
    GROUP BY Year(o.AccomplishDate)
    --ORDER BY Year(o.AccomplishDate) ASC
    )
    END

Я получаю ошибки:

Сообщение 116, Уровень 16, Состояние 1, Строка 14 Можно указать только одно выражение в списке выбора, когда подзапрос не вводится с EXISTS.

Msg 116, уровень 16, состояние 1, строка 22 только одно выражение может быть указано в выберите список, когда подзапрос не введено с EXISTS.

Что не так?

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

ВЫ хотите использовать IF вместо CASE

DECLARE @hipero_a int
SET @hipero_a = 1

IF @hipero_a = 1 BEGIN ;
    SELECT Year(o.AccomplishDate) AS [Rok], Month(o.AccomplishDate) AS [Miesiąc], SUM(oi.Price) AS [Przychód]
    FROM Orders o JOIN OrdersItems oi ON oi.OrderId = o.Id
    WHERE o.State = 0
    GROUP BY Year(o.AccomplishDate), Month(o.AccomplishDate)
    --ORDER BY Year(o.AccomplishDate), Month(o.AccomplishDate) ASC
END ;
IF @hipero_a = 2 BEGIN ;
    SELECT Year(o.AccomplishDate) AS [Rok], SUM(oi.Price) AS [Przychód]
    FROM Orders o JOIN OrdersItems oi ON oi.OrderId = o.Id
    WHERE o.State = 0
    GROUP BY Year(o.AccomplishDate)
    --ORDER BY Year(o.AccomplishDate) ASC
    )
END;
1 голос
/ 29 июня 2011

AlexKuznetsov имеет правильный ответ.Проблема заключается в том, что внешний выбор ожидает список столбцов, которые могут быть возвращены.Оператор Case является ОДНЫМ из этих столбцов, поэтому подвыбор должен возвращать не более ОДНОГО столбца, который будет передан родительскому элементу в качестве значения столбца.

Надеюсь, это поможет объяснить причину возникновения ошибкибыли.

Стив Г.

0 голосов
/ 29 июня 2011

Спасибо! Я просто устал, чтобы найти это. Так что это работает:

DECLARE @DivideBy int
SET @DivideBy = 1

IF @DivideBy = 1 BEGIN ;
    SELECT Year(o.AccomplishDate) AS [Rok], Month(o.AccomplishDate) AS [Miesiąc], SUM(oi.Price) AS [Przychód]
    FROM Orders o JOIN OrdersItems oi ON oi.OrderId = o.Id
    WHERE o.State = 0
    GROUP BY Year(o.AccomplishDate), Month(o.AccomplishDate)
    ORDER BY Year(o.AccomplishDate) DESC, Month(o.AccomplishDate) DESC
END ;
IF @DivideBy = 2 BEGIN ;
    SELECT Year(o.AccomplishDate) AS [Rok], SUM(oi.Price) AS [Przychód]
    FROM Orders o JOIN OrdersItems oi ON oi.OrderId = o.Id
    WHERE o.State = 0
    GROUP BY Year(o.AccomplishDate)
    ORDER BY Year(o.AccomplishDate) DESC
END;

Могу ли я как-нибудь оптимизировать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...