Хранимая процедура с использованием групп по и упорядочить по - PullRequest
0 голосов
/ 03 марта 2011

У меня есть это в моем сохраненном процессе. Я хотел бы сгруппировать записи по Offer_Continent и упорядочить по Offer_CountryCode ASC, но это не дает результатов в порядке группировки по континентам.

Ниже мое избрание

    SELECT
        Offer_SubCatName,
        Offer_TagLine,
        Offer_Type,         
        CustomOffersAttributes.Attribute_Value3,
        Offer_ID,
        Offer_ShortDescription,
        Offer_AccommRating,
        Offer_ResortName,
        Offer_AccommName,
        Offer_CountryCode,
        Offer_Continent,
        Offer_FlightSupplierCode,
        Offer_OriginAirport,
        Offer_DestinationAirport,
        CustomOffersAttributes.Attribute_Value4,
        CustomOffersAttributes.Attribute_Value,
        CustomOffersAttributes.Attribute_Value2,
        Op_Name                     
    FROM
        CustomOffers
        INNER JOIN CustomOffersAttributes ON CustomOffersAttributes.Attribute_ID = dbo.fn_CustomOffers_CheapestDatePrice(CustomOffers.Offer_ID)
        FULL OUTER JOIN Suppliers ON Suppliers.Op_Code = CustomOffers.Offer_FlightSupplierCode
    WHERE
        (
            @CategoryID = 0
        OR
            Offer_CatID = @CategoryID
        )
        AND
        (
            @OfferIDs = ''
            OR
            Offer_ID in (select val from fn_CreateInList(@OfferIDs))
        )
        AND
        (
            @SubCategoryName = ''
        OR
            Offer_SubCatName = @SubCategoryName
        )
        AND ISNULL(Offer_Starts,GETDATE()) <= GETDATE()
        AND ISNULL(Offer_Expires,GETDATE()) >= GETDATE()

    GROUP BY
        Offer_Continent,
        Offer_SubCatName,
        Offer_TagLine,
        Offer_Type,         
        CustomOffersAttributes.Attribute_Value3,            
        Offer_ID,
        Offer_ShortDescription,
        Offer_AccommRating,
        Offer_ResortName,
        Offer_AccommName,
        Offer_CountryCode,
        Offer_Continent,
        Offer_FlightSupplierCode,
        Offer_OriginAirport,
        Offer_DestinationAirport,
        CustomOffersAttributes.Attribute_Value4,
        CustomOffersAttributes.Attribute_Value,
        CustomOffersAttributes.Attribute_Value2,
        Op_Name 
    ORDER BY 
         Offer_Continent ASC, 
         Offer_CountryCode ASC

Выше приведен результат, как показано ниже

Африка (Offer_Continent)

  • Кения - (Offer_CountrCode)

Caribbean (Offer_Continent)

  • Антигуа - (Offer_CountrCode)
  • Барбадос - (Offer_CountrCode)
  • Гренада - (Offer_CountrCode)
  • Монтего-Бей - (Offer_CountrCode)
  • Kingston - (Offer_CountrCode)
  • Сент-Люсия - (Offer_CountrCode)
  • Тобаго - (Offer_CountrCode)

Но я бы хотел получить ЕДИНСТВЕННЫЙ заказ на Offer_CountryCode Однако, когда я просто заказываю на Offer_CountryCode, это выглядит как ниже

Caribbean (Offer_Continent)

  • Антигуа - (Offer_CountrCode)
  • Барбадос - (Offer_CountrCode)
  • Гренада - (Offer_CountrCode)
  • Монтего-Бей - (Offer_CountrCode)
  • Kingston - (Offer_CountrCode)

Afirca (Offer_Continent)

  • Кения - (Offer_CountrCode)

Caribbean (Offer_Continent)

  • Сент-Люсия - (Offer_CountrCode)
  • Тобаго - (Offer_CountrCode)

Как видите, карибский бассейн повторяется. Вот почему я подумал использовать GROUP BY Clause.В любом случае, я хотел бы иметь набор записей, который выглядит следующим образом.

Caribbean (Offer_Continent)

  • Антигуа - (Offer_CountrCode)
  • Барбадос - (Offer_CountrCode)
  • Гренада - (Offer_CountrCode)
  • Монтего-Бей - (Offer_CountrCode)
  • Kingston - (Offer_CountrCode)
  • Сент-Люсия - (Offer_CountrCode)
  • Тобаго - (Offer_CountrCode)

Африка (Offer_Continent)

  • Кения - (Offer_CountrCode)

Надеюсь, понятно, что я пытаюсь сделать ..? Заранее спасибо ..

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Вам не нужно использовать group by, поскольку вы не используете никаких агрегатных функций. Вы можете поместить любые поля, которые хотите использовать, чтобы упорядочить данные в order by и просто не использовать group by.

1 голос
/ 03 марта 2011

Хорошо, вы хотите сделать заказ по континентам, а затем по странам, но порядок континентов должен определяться самой ранней страной на каждом континенте.

Я думаю, что будет работать следующее:

;WITH Offers AS (
SELECT
    Offer_SubCatName,
    Offer_TagLine,
    Offer_Type,         
    CustomOffersAttributes.Attribute_Value3,
    Offer_ID,
    Offer_ShortDescription,
    Offer_AccommRating,
    Offer_ResortName,
    Offer_AccommName,
    Offer_CountryCode,
    Offer_Continent,
    Offer_FlightSupplierCode,
    Offer_OriginAirport,
    Offer_DestinationAirport,
    CustomOffersAttributes.Attribute_Value4,
    CustomOffersAttributes.Attribute_Value,
    CustomOffersAttributes.Attribute_Value2,
    Op_Name                     
FROM
    CustomOffers
    INNER JOIN CustomOffersAttributes ON CustomOffersAttributes.Attribute_ID = dbo.fn_CustomOffers_CheapestDatePrice(CustomOffers.Offer_ID)
    FULL OUTER JOIN Suppliers ON Suppliers.Op_Code = CustomOffers.Offer_FlightSupplierCode
WHERE
    (
        @CategoryID = 0
    OR
        Offer_CatID = @CategoryID
    )
    AND
    (
        @OfferIDs = ''
        OR
        Offer_ID in (select val from fn_CreateInList(@OfferIDs))
    )
    AND
    (
        @SubCategoryName = ''
    OR
        Offer_SubCatName = @SubCategoryName
    )
    AND ISNULL(Offer_Starts,GETDATE()) <= GETDATE()
    AND ISNULL(Offer_Expires,GETDATE()) >= GETDATE()
)
SELECT
    *
FROM
    Offers o1
ORDER BY
    (SELECT MIN(Offer_Country) from Offers o2 where o2.Offer_Continent = o1.Offer_Continent) asc,
    Offer_Country
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...