当前位置: 首页 > 面试题库 >

将多行合并为一行

厉成仁
2023-03-14
问题内容

我正在尝试不同的JOIN查询,但没有得到想要的结果。

我有2张桌子:

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

我找不到想要的结果。

我想得到以下结果:

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

问题答案:

您不能具有这样的动态列数,但是可以 将数据连接 成字符串:

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;

或者您可以使用或手动 旋转行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

您还可以将前面的语句转换为 动态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

[sql fiddle demo](http://sqlfiddle.com/#!6/dee00/41)



 类似资料:
  • 问题内容: 假设我在MySQL数据库中有两个表。 表格1: 表2: 从数据库中选择行时,是否有任何方法可以将第二个表中的行作为列连接到第一个表中? 直接从MySQL查询获得的期望结果是: 谢谢你的帮助! 问题答案: 这种数据转换类型称为PIVOT。MySQL没有枢轴函数,但是您可以使用带有表达式的聚合函数来复制它: 请参阅带有演示的SQL Fiddle。 这也可以使用您的多个联接来编写,并且您将在

  • 问题内容: 我们有些SQL杂语。说我有一个看起来像这样的结果… 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | A 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | B 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | C 61E77D90-D53D-4E2E-A09E-9D6F012EB59C | D 7ce9

  • 问题内容: 我正在使用SQL Server2008。我具有下表中的数据: 我想以这种格式获取数据: 我怎样才能做到这一点? 问题答案: 使用PIVOT您可以执行以下操作 产生 查看有效的Data.SE示例 在不支持PIVOT的数据库中,您可以改为对表进行多次联接。尽管您可能还是想这样做,但是正如GBN所指出的那样,因为我们没有使用聚合。 查看有效的Data.SE示例

  • 问题内容: 我需要一些有关SUM功能的帮助。我试图将同一帐户的帐单金额相加为一个总计,但是我得到的结果显示我的SUM列只是我的第一列的3倍。 这是我想要的模拟数据结果: 询问: 或者 如果可能,我希望同时获得两个结果。 这是我得到的: 我的SUM列只是乘以三,实际上并没有基于帐号对数据求和。 问题答案: 谢谢你的回复。原来我的问题是重复条目的数据库问题,而不是我的逻辑。快速表同步修复了该问题,并且

  • 问题内容: 我需要将多行合并为单行,这将是简单的带有空间的连接 我希望数据帧像这样转换:(空格分隔)tempx值 我试过的 这行得通,但是它将所有列中的行合并在一起,如下所示: 有什么优雅的解决方案吗? 问题答案: 您可以使用和功能:

  • 我在同一个excel表中有3000个类似于这些表的表: PS:我只需要csv表中指定的信息