以下查詢
DECLARE @SNH TABLE
(
dt date,
QueueName varchar(10),
SN varchar(10)
)
INSERT INTO @SNH (Dt, QueueName, SN)
VALUES ('2001-04-04', 'Queue01', 'Q01SN01'),
('2001-04-05', 'Queue01', 'Q01SN01'),
('2001-04-06', 'Queue01', 'Q01SN01'),
('2001-04-04', 'Queue02', 'Q02SN01'),
('2001-04-05', 'Queue02', 'Q02SN01'),
('2001-04-06', 'Queue02', 'Q02SN02')
DECLARE @QH TABLE
(
DT date,
QueueName varchar(10)
)
INSERT INTO @QH(DT, QueueName)
VALUES ('2001-04-04','Queue01'),
('2001-04-05','Queue01'),
('2001-04-06','Queue01'),
('2001-04-04','Queue02'),
('2001-04-05','Queue02'),
('2001-04-06','Queue02')
SELECT DISTINCT
q.QueueName clnQueueName,
MIN(q.Dt) OVER (PARTITION BY q.QueueName) clnStartDate,
MAX(q.Dt) OVER (PARTITION BY q.QueueName) clnEndDate,
s.SN
FROM
@QH q
LEFT JOIN
@SNH s ON s.QueueName = q.QueueName
回傳此輸出:
| cln佇列名 | cln開始日期 | cln結束日期 | 序列號 |
| 佇列01 | 2001-04-04 | 2001-04-06 | Q01SN01 |
| 佇列02 | 2001-04-04 | 2001-04-06 | Q02SN01 |
| 佇列02 | 2001-04-04 | 2001-04-06 | Q02SN02 |
我的目標是聚合成一個逗號分隔的串列
SELECT DISTINCT
q.QueueName clnQueueName,
MIN(q.Dt) OVER (PARTITION BY q.QueueName) clnStartDate,
MAX(q.Dt) OVER (PARTITION BY q.QueueName) clnEndDate,
STRING_AGG(s.SN,',')
FROM
@QH q
LEFT JOIN
@SNH s ON s.QueueName = q.QueueName AND s.Dt = q.Dt
如下
| cln佇列名 | cln開始日期 | cln結束日期 | 序列號 |
| 佇列01 | 2001-04-04 | 2001-04-06 | Q01SN01 |
| 佇列02 | 2001-04-04 | 2001-04-06 | Q02SN01,Q02SN02 |
相反,我得到:
訊息 8120,級別 16,狀態 1,第 36
行列“@QH.QueueName”在選擇串列中無效,因為它不包含在聚合函式或 GROUP BY 子句中
對不起,我無法得到它。
@QH.QueueName中甚至沒有提到SELECT,只有q.QueueName。
我在這里缺少什么?
uj5u.com熱心網友回復:
根據檔案,如果不是唯一選擇的專案,則需要一個group by子句。string_agg正確分組后,您不再需要視窗函式或distinct.
要僅獲取不同的值,SN您需要分組兩次,第一次在子查詢(在本例中為 CTE)中獲取不同的值,SN第二次使用string_agg獲取不同的值QueueName。
WITH cte AS (
SELECT
q.QueueName clnQueueName
, MIN(q.Dt) clnStartDate
, MAX(q.Dt) clnEndDate
, s.SN
FROM @QH q
LEFT JOIN @SNH s
ON s.QueueName = q.QueueName AND s.Dt = q.Dt
GROUP BY q.QueueName, s.SN
)
SELECT clnQueueName
, MIN(clnStartDate) clnStartDate
, MAX(clnEndDate) clnEndDate
, STRING_AGG(SN,',') SN
FROM cte
GROUP BY clnQueueName;
回報:
| cln佇列名 | cln開始日期 | cln結束日期 | 序列號 |
|---|---|---|---|
| 佇列01 | 2001-04-04 | 2001-04-06 | Q01SN01 |
| 佇列02 | 2001-04-04 | 2001-04-06 | Q02SN01,Q02SN02 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/486187.html
上一篇:為什么在SQLite中,`SELECT(SELECT1UNIONSELECT2UNIONSELECT3)INTERSECTSELECT3UNIONSELECT4`等于4而不是3?
