[英]Combine multiple rows into one row
I'm trying different JOIN queries, but I'm not getting result I'm looking for. 我正在尝试不同的JOIN查询,但我没有得到我正在寻找的结果。
I've got 2 tables: 我有两张桌子:
Table 1: **StockItemShort**
ItemID | Code | Name
432724 | CK002-16-09 | Green Daisy Pearl Earrings
432759 | CK002-16-149 | Emerald Crystal Centre Daisy Earrings
Table 2: **StockItemCatSearchValueShort**
ItemID | SearchValueID
432724 | 388839
432724 | 389061
432724 | 390269
432724 | 389214
432759 | 388839
432759 | 389051
432759 | 390269
432759 | 389214
I can't get result I'm looking for. 我无法得到我正在寻找的结果。
I'd like to get following result: 我想获得以下结果:
ItemID | Code | Name | SearchValueID | SearchValueID | SearchValueID | SearchValueID
432724 | CK002-16-09 | Green Daisy Pearl Earrings | 388839 | 389061 | 390269 | 389214
432759 | CK002-16-149 | Emerald Crystal Centre Daisy Earrings | 388839 | 389051 | 390269 | 389214
You cannot have dynamic number of column like that, but you can concatenate your data into string: 您不能拥有这样的动态列数,但您可以将数据连接到字符串中:
select
s.ItemID, s.Code, s.Name,
stuff(
(
select ', ' + CAST(sv.SearchValueID AS VARCHAR)
from ItemSearch as sv
where sv.ItemID = s.ItemID
for xml path(''), type
).value('.', 'nvarchar(128)')
, 1, 2, '') as SearchValues
from Item as s;
or you can pivot rows with PIVOT command
or manually ( I prefer latter approach, it just seems more flexible for me, but pivot
can greatly reduce amount of code in certain situations ): 或者您可以使用
PIVOT command
或手动转动行 ( 我更喜欢后一种方法,它对我来说似乎更灵活,但在某些情况下, pivot
可以大大减少代码量 ):
with cte as (
select
*,
row_number() over(partition by sv.ItemID order by sv.SearchValueID) as row_num
from ItemSearch as sv
)
select
s.ItemID, s.Code, s.Name,
max(case when sv.row_num = 1 then sv.SearchValueID end) as SearchValueID1,
max(case when sv.row_num = 2 then sv.SearchValueID end) as SearchValueID2,
max(case when sv.row_num = 3 then sv.SearchValueID end) as SearchValueID3,
max(case when sv.row_num = 4 then sv.SearchValueID end) as SearchValueID4
from Item as s
inner join cte as sv on sv.ItemID = s.ItemID
group by s.ItemID, s.Code, s.Name
You also can turn previous statement into dynamic SQL like this: 您还可以将以前的语句转换为动态SQL,如下所示:
declare @stmt nvarchar(max)
select
@stmt =
isnull(@stmt + ',','') +
'max(case when sv.row_num = ' + cast(rn as nvarchar(max)) +
' then sv.SearchValueID end) as SearchValueID' + cast(rn as nvarchar(max))
from (
select distinct row_number() over(partition by ItemID order by SearchValueID) as rn
from ItemSearch
) as a
select @stmt = '
with cte as (
select
*,
row_number() over(partition by sv.ItemID order by sv.SearchValueID) as row_num
from ItemSearch as sv
)
select
s.ItemID, s.Code, s.Name,' + @stmt + '
from Item as s
inner join cte as sv on sv.ItemID = s.ItemID
group by s.ItemID, s.Code, s.Name;'
exec dbo.sp_executesql @stmt = @stmt
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.