2015-02-10 2 views
0

У меня есть SQL-запрос, где я получении некоторых данных с помощью JOINS, который имеет также DateTime поле Delivery, но при получении я преобразуя его в строку формата MMM YYYY, но в конце Я хотел бы отсортировать весь список по Delivery, но по мере того, как я преобразовал эту колонку в строку, я не совсем уверен, как отсортировать результаты по исходному DateTime поля Delivery. Мой запрос выглядит следующим образомСортировка по дате строкового типа в SQL Server 2012

WITH deliveryProducts AS 
(
    SELECT DISTINCT FORMAT(a.Delivery,'MMMM yyyy') AS Delivery, b.Product 
    FROM DEALS as a, PRODUCTS as b Where a.TradeDate<[email protected] 
) 
, deliveryActuals AS 
(
    SELECT 
      FORMAT(a.Delivery,'MMMM yyyy') AS Delivery, 

      b.Product,COUNT(a.Id) AS Trades, 
      ((6.2898*SUM(a.Volume))/DAY(EOMONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery), 0))))*0.001 AS BBLperDay, 
      SUM(a.Volume) AS M3, 

     SUM(a.Volume*a.Price)/Sum(a.Volume) AS WeightedAverage 
FROM  Deals AS a right outer join Products AS b 
      ON a.Product=b.Product AND 
      a.TradeDate<[email protected] 
GROUP BY b.Product, 

      DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery),0), FORMAT(a.Delivery,'MMMM yyyy') 

) 

SELECT 
    dp.Delivery, dp.Product, trades, BBLperDay, M3, WeightedAverage 
FROM 
    deliveryProducts dp 

    LEFT JOIN deliveryActuals da 
    on dp.Delivery = da.Delivery 
    and dp.product = da.Product 

ORDER BY dp.Delivery,dp.Product 

Этот запрос дает мне необходимые данные, но разные по Delivery как string.

Могу ли я узнать лучший способ исправить это?

ответ

1
ORDER BY cast(dp.Delivery as date), dp.Product 

SQL Server может обрабатывать заливкой строку «MMMM гггг» или «MMM YYYY» в дате или дате времени.

+0

Работал хорошо. благодаря – DoIt

0

Вы можете группировать по месяцам и годам, как целые числа, а затем отформатировать дату в конце:

WITH deliveryProducts AS 
(
    SELECT MONTH(a.Delivery) AS DeliveryMonth, 
      YEAR(a.Delivery) AS DeliveryYear, 
      b.Product 
    FROM DEALS as a, PRODUCTS as b 
    WHERE a.TradeDate <= @tradeEndDate 
) 
, deliveryActuals AS 
(
    SELECT MONTH(a.Delivery) AS DeliveryMonth, 
      YEAR(a.Delivery) AS DeliveryYear, 
      b.Product,COUNT(a.Id) AS Trades, 
      ((6.2898*SUM(a.Volume))/DAY(EOMONTH(DATEADD(MONTH, DATEDIFF(MONTH, 0,a.Delivery), 0))))*0.001 AS BBLperDay, 
      SUM(a.Volume) AS M3, 

     SUM(a.Volume*a.Price)/Sum(a.Volume) AS WeightedAverage 
FROM  Deals AS a right outer join Products AS b 
      ON a.Product=b.Product AND 
      a.TradeDate<[email protected] 
GROUP BY b.Product, 
      MONTH(a.Delivery), 
      YEAR(a.Delivery) 

) 

SELECT 
    FORMAT(
     CAST(CAST(dp.DeliveryYear AS VARCHAR(4)) + 
    RIGHT('0' + CAST(dp.DeliveryMonth AS VARCHAR(2)), 2) + 
    RIGHT('0' + CAST(1 AS VARCHAR(2)), 2) 
AS DATETIME), 'MMMM yyyy'), 
    dp.Product, trades, BBLperDay, M3, WeightedAverage 
FROM 
    deliveryProducts dp 

    LEFT JOIN deliveryActuals da 
    on dp.DeliveryMonth = da.DeliveryMonth 
    and dp.DeliveryYear = da.DeliveryYear 
    and dp.product = da.Product 

ORDER BY dp.DeliveryYear, dp.DeliveryYear, dp.Product 
Смежные вопросы