Sql-Server

SQL Server 查詢需要幫助:訪問不在 GROUP BY 子句中的列

  • August 8, 2019

我有一個表,其列如下:

CREATE TABLE Tests (
 TestDate date,
 EntityID int)

使用儲存過程,我想找到在同一“學年”中發生的成對測試的“學年”,其中​​“學年”定義為固定月數後測試日期的年份部分(@ AcYearOff,值通常等於 7) 被減去。我使用以下程式碼執行此操作:

CREATE TABLE #tmpTable (
 vYear char(4),
 vDate char(8))

INSERT # tmpTable (vYear, vDate)
SELECT DATEPART(yyyy, dateadd(MONTH, @AcYearOff, TestDate)), format(TestDate, 'MMM yyyy')
FROM Tests
WHERE Tests.EntityID = @ EntityID

SELECT vYear
FROM # tmpTable
GROUP BY vYear
HAVING count(vYear) = 2
ORDER BY vYear

上面的程式碼完全符合預期。我現在想向該查詢添加一個字元串,該字元串顯示進行兩次測試的實際月份和年份。為此,我將列 vDate 添加到臨時表中,但我無法弄清楚如何組合兩個 vDate 值並將它們作為字元串返回。

為了清楚起見,下面是 Tests 表中的一些範例數據:

2018-08-12, 21
2018-09-04, 22
2019-04-17, 21
2019-08-03, 21

並且儲存過程應該返回:

“2018 年”、“2018 年 8 月和 2019 年 4 月”

我期待看到您的建議。謝謝你。

在 SQL Server 2017 或 Azure SQL 數據庫中:

SELECT vYear, STRING_AGG(vDate, ' and ')
FROM #tmpTable
GROUP BY vYear
HAVING count(vYear) = 2
ORDER BY vYear;

在 SQL Server 2016 或更低版本中:

SELECT vYear, STUFF((SELECT ' and ' + vDate
 FROM #tmpTable
 WHERE vYear = t.vYear
 ORDER BY vDate
 FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)'),1,5,'')
FROM #tmpTable AS t
GROUP BY vYear
HAVING count(vYear) = 2
ORDER BY vYear;

引用自:https://dba.stackexchange.com/questions/244893