如果您嘗試使用子查詢作爲表達式並返回多條記錄,那麼SQL Server會發出抱怨。你會看到錯誤:
Msg 512, Level 16, State 1, Line 3 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= ,> >, >= or when the subquery is used as an expression.
就你而言,你在主要的select語句中使用子查詢作爲表達式。
您的輸出結果通常是您想要在報告或應用程序層完成的。這不是SQL擅長的,但可能的。然而,有一點可以幫助您創建一個包含每個客戶和每年的地點列表的字段。 FOR XML子句擅長將許多值濃縮爲列表或xml值。下面是一個例子,它創建了一個逗號分隔的位置列表,但您可以使用任何你喜歡的分隔符。
create table #customer (customerID int, name varchar(50))
create table #places (customerID int, year int, location varchar(50))
insert into #customer values (1, 'Bob')
insert into #customer values (2, 'Dennis')
insert into #places values (1, 2014, 'Japan')
insert into #places values (1, 2014, 'Tucon')
insert into #places values (2, 2014, 'Paris')
insert into #places values (2, 2014, 'Texas')
insert into #places values (1, 2015, 'Korea')
insert into #places values (1, 2015, 'England')
insert into #places values (2, 2015, 'England')
insert into #places values (2, 2015, 'Canada')
insert into #places values (2, 2015, 'Portland')
insert into #places values (1, 2016, 'Mexico')
insert into #places values (2, 2016, 'China')
select name, year,
STUFF(
(select ',' + location
from #places
where #places.customerID = c.customerID
and #places.year = p.year
for XML Path('')
)
, 1, 1, ''
) AS locations
FROM #customer c
JOIN #places p
on p.customerID = c.customerID
group by c.name, c.customerID, p.year
然後從這種數據格式,你可以做更多的事情像你上面的查詢,因爲位置正好是每一個客戶/年組合的價值。您還可以在SQL Server中使用PIVOT
功能,但您可能再次可以在報告圖層中執行此操作。例如使用在Excel中旋轉的功能,報表服務...等
有沒有「感覺」一下 - 它或者按照預期的方式工作。我懷疑當你運行這個時,你會得到'子查詢返回多個值'的錯誤,但是看起來你還沒有真正運行它?你在這裏之後是一個交叉表。 –
@ Nick.McDermaid啊!是!我希望能夠連接並運行它!我想我也會得到這個錯誤。哦!交叉!謝謝你在這個方向的重點! – Jim