情況:
假設有一個表ALPHA,其中包含一列ALPHA.ID_BETA(表上的外鍵BETA)和一列ALPHA.CREATIONDATE (DATETIME NOT NULL)。
現在假設 Table 中有以下記錄ALPHA:
| ID | 創建日期 (YYYY-MM-DD) | ID_BETA |
|---|---|---|
| 1 | 2022-05-26 00:00:00.000 | 1 |
| 2 | 2022-02-02 00:00:00.000 | 1 |
| 3 | 2022-01-28 00:00:00.000 | 1 |
| 4 | 2022-01-02 00:00:00.000 | 1 |
現在想象 TableBETA看起來像這樣(為簡單起見,我省略了其他列:
| ID |
|---|
| 1 |
CREATIONDATE所需輸出:是一個連接單個ID_BETA按日期升序排序的所有值(格式:DATENAME YYYY)的值。在這個例子中,輸出應該是January 2022, February 2022, May 2022(顯然取決于語言設定)
我試過的:
SELECT STUFF(
(SELECT ', '
DATENAME(MONTH,(ALPHA.CREATIONDATE)) DATENAME(YEAR, ALPHA.CREATIONDATE)
FROM ALPHA
WHERE ALPHA.ID_BETA = 1
GROUP BY ALPHA.CREATIONDATE
ORDER BY ALPHA.CREATIONDATE ASC
FOR XML PATH('')),1, 1, '')
然而,這不會給我不同的價值觀。嘗試明顯的DISTINCT陳述會給我以下錯誤:
服務器:如果指定了 SELECT DISTINCT,則訊息 145、級別 15、狀態 1、行 1 ORDER BY 項必須出現在選擇串列中。
請注意,我無法使用“新” STRING_AGG函式解決此問題,因為它僅受 SQL-Server2017 及更高版本的支持。
uj5u.com熱心網友回復:
您需要進行分組和排序EOMONTH(CREATIONDATE),以便每月按單個日期分組,而不是僅按CREATIONDATE.
另請注意,您需要
.value對XML進行轉義,并且第三個引數STUFF應該與分隔符的長度相同
SELECT STUFF(
(SELECT
', ' DATENAME(MONTH, EOMONTH(a.CREATIONDATE)) DATENAME(YEAR, EOMONTH(a.CREATIONDATE))
FROM ALPHA a
WHERE a.ID_BETA = 1
GROUP BY
EOMONTH(a.CREATIONDATE)
ORDER BY
EOMONTH(a.CREATIONDATE)
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(', '), '')
如果你想每行都這樣做,BETA你可以使用CROSS APPLY或子查詢:
SELECT STUFF(
(SELECT
', ' DATENAME(MONTH, EOMONTH(a.CREATIONDATE)) DATENAME(YEAR, EOMONTH(a.CREATIONDATE))
FROM ALPHA a
WHERE a.ID_BETA = b.ID
GROUP BY
EOMONTH(a.CREATIONDATE)
ORDER BY
EOMONTH(a.CREATIONDATE)
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)'), 1, LEN(', '), '')
FROM BETA b;
uj5u.com熱心網友回復:
正如錯誤訊息所說,完全按照 select 子句中的運算式排序
SELECT STUFF(
(SELECT distinct ', '
DATENAME(MONTH,(ALPHA.CREATIONDATE)) DATENAME(YEAR, ALPHA.CREATIONDATE)
FROM ALPHA
WHERE ALPHA.ID_BETA = 1
GROUP BY ALPHA.CREATIONDATE
ORDER BY ', '
DATENAME(MONTH,(ALPHA.CREATIONDATE)) DATENAME(YEAR, ALPHA.CREATIONDATE) ASC
FOR XML PATH('')),1, 1, '')
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431792.html
下一篇:避免從其他表中選擇資料
