2011-04-30 45 views
4

選擇不同的週一yyyy格式輸出sorty我有與下列數據的表列datetimeSQL服務器:由降序排列

2011-03-23 
2011-04-19 
2011-04-26 
2011-05-26 

我要選擇通過報告日期倒序排列不同mon-yyyy格式輸出。我們需要在SQL語句中

這個SQL工作只選擇一列,但我想通過ReportDate列訂購

SELECT distinct SUBSTRING (convert(varchar, ReportDate, 100),1,3) +'-'+ 
     SUBSTRING (convert(varchar, ReportDate, 100),8,4) 
    FROM [EnvelopsDB].[dbo].[Envelopes] 

輸出

Apr-2011 
Mar-2011 
May-2011 

這SQL提供了一個錯誤:

SELECT distinct SUBSTRING (convert(varchar, ReportDate, 100),1,3) +'-'+ 
     SUBSTRING (convert(varchar, ReportDate, 100),8,4) 
    FROM [EnvelopsDB].[dbo].[Envelopes] 
    order by ReportDate 

錯誤:

Msg 145, Level 15, State 1, Line 2
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.

什麼是最好的SQL查詢來獲取輸出,我需要?

回答

5
with testdata as 
(
    select cast('2011-03-23' as datetime) as d 
union all 
    select cast('2011-04-19' as datetime) 
union all 
    select cast('2011-04-26' as datetime) 
union all 
    select cast('2011-05-26' as datetime) 
) 
SELECT DATENAME(month,d)+'-'+DATENAME(year,d) 
FROM testdata 
GROUP BY DATEPART(year,d), DATEPART(month,d), DATENAME(month,d),DATENAME(year,d) 
ORDER BY DATEPART(year,d), DATEPART(month,d) 

SELECT DATENAME(month,ReportDate)+'-'+DATENAME(year,ReportDate) 
FROM [EnvelopsDB].[dbo].[Envelopes] 
GROUP BY DATEPART(year,ReportDate), DATEPART(month,ReportDate), DATENAME(month,ReportDate),DATENAME(year,ReportDate) 
ORDER BY DATEPART(year,ReportDate), DATEPART(month,ReportDate) 
+0

這並沒有給我想要的結果。我希望像這樣'SELECT DISTINCT right(convert(varchar,ReportDate,106),8) FROM [EnvelopsDB]。[dbo]。[Envelopes] ORDER BY ReportDate desc' – sfgroups 2011-04-30 04:46:33

+0

您希望它按日期順序排序嗎? – Hogan 2011-04-30 04:51:07

+0

@sfgroups - 已修復。 – Hogan 2011-04-30 04:56:42

2

您可以在ReportDate說明使用GROUP BY而不是DISTINCT這樣

SELECT SUBSTRING (convert(varchar, ReportDate, 100),1,3) +'-'+ 
     SUBSTRING (convert(varchar, ReportDate, 100),8,4) 
FROM [EnvelopsDB].[dbo].[Envelopes] 
GROUP BY SUBSTRING (convert(varchar, ReportDate, 100),1,3) +'-'+ 
      SUBSTRING (convert(varchar, ReportDate, 100),8,4) 

隨着順序由使用ROW_NUMBER(),而不是按組。

select substring(convert(varchar, Env.ReportDate, 100),1,3) +'-'+ 
      substring(convert(varchar, Env.ReportDate, 100),8,4) 
from (select 
     ReportDate, 
     row_number() over(partition by datepart(year, ReportDate), datepart(month, ReportDate) 
          order by (select 1)) as rn 
     from [EnvelopsDB].[dbo].[Envelopes]) as Env  
where Env.rn = 1 
order by Env.ReportDate desc 
+0

從這個SQL如何排序結果按降序排列。 – sfgroups 2011-04-30 04:43:11

1

如果你不介意在結果集中一個額外的列,那麼這將正常工作。

SELECT DISTINCT 
    REPLACE(RIGHT(CONVERT(VARCHAR(11), ReportDate, 106), 8), ' ', '-') AS [Mon-YYYY], 
    RANK() OVER(ORDER BY CONVERT(VARCHAR(7), ReportDate, 120) /* [YYYY-MM]*/ DESC) AS r_order 
FROM [EnvelopsDB].[dbo].[Envelopes] 
ORDER BY r_order DESC 
如果你不想提供的MMM-YYYY列別名(然後你可以在ORDER BY使用),你不能只是做** ORDER BY 1個DESC **? SELECT DISTINCT SUBSTRING(轉換(VARCHAR,ReportDate,100),1,3)+ ' - '。+ SUBSTRING(轉換(VARCHAR,ReportDate,100),8,4) FROM [EnvelopsDB] [DBO] [信封] ORDER BY 1 DESC 或者只是添加列別名: SELECT DISTINCT SUBSTRING(轉換(VARCHAR,ReportDate,100),1,3)+ ' - ' + SUBSTRING(轉換(VARCHAR ,ReportDate,100),8,4)AS ReportDate FROM [EnvelopsDB]。[dbo]。[Envelopes] ORDER BY ReportDate DESC
+0

沒有。這將排序格式化的值 – gbn 2011-04-30 08:51:32

+0

啊 - 我明白了。原來的問題並不清楚。我現在重新閱讀並看到那部分內容。 – beach 2011-04-30 16:30:56

2

我想有一個類似的問題,這裏最近,我現在找不到,但得到的答覆是東西這樣的效果:

SELECT 
    SUBSTRING(CONVERT(varchar, ReportDate, 100), 1, 3) + '-' + 
    SUBSTRING(CONVERT(varchar, ReportDate, 100), 8, 4) 
FROM [EnvelopsDB].[dbo].[Envelopes] 
GROUP BY 
    SUBSTRING(CONVERT(varchar, ReportDate, 100), 1, 3), 
    SUBSTRING(CONVERT(varchar, ReportDate, 100), 8, 4) 
ORDER BY MIN(ReportDate) 

此外,當您選擇目前的輸出方式格式爲mmm-yyyy基本上沒問題,我可能會略有不同。這裏:

SELECT 
    LEFT(DATENAME(month, ReportDate), 3) + '-' + 
    DATENAME(year, ReportDate) 
FROM [EnvelopsDB].[dbo].[Envelopes] 
GROUP BY 
    DATENAME(month, ReportDate), 
    DATENAME(year, ReportDate) 
ORDER BY MIN(ReportDate)