【问题标题】:SQL Server T-SQL: trouble grouping data from two tablesSQL Server T-SQL:对来自两个表的数据进行分组时遇到问题
【发布时间】:2021-09-09 18:25:45
【问题描述】:

我有一张表 ListofString 包含这些列:

parent_id
parent_prop_id
element_value

我的数据看起来像这样(为简单起见,我排除了大部分数据)

parent_id   parent_prop_id  element_value
------------------------------------------
C4236016    BEAE885B        acw1
C4236016    BEAE885B        acw2
C4236016    BEAE885B        acw3
C4236016    BEAE885B        acw11
C4236016    1DC045A5        mmw1
C4236016    1DC045A5        mmw2
C4236016    1DC045A5        mmw3

在一个选择中,我想得到这个:

parent_id   String1         String2
------------------------------------------------
C4236016    mmw1|mmw2|mmw3  acw1|acw2|acw3|acw11

相反,我得到了这个:

parent_id   String1         String2
------------------------------------------------
C4236016                    acw1|acw2|acw3|acw11
C4236016    mmw1|mmw2|mmw3

    

这是我尝试过的:

SELECT 
    LOS0.parent_id,
    String1 = CASE 
                 WHEN LOS0.parent_prop_id = '1DC045A5' 
                    THEN STUFF((SELECT '|' + LOS1.element_value 
                                FROM ListOfString LOS1
                                WHERE LOS0.parent_prop_id = LOS1.parent_prop_id
                                ORDER BY LOS0.parent_prop_id
                                FOR XML PATH('')), 1, LEN(','), '')
                    ELSE '' 
              END,
    String2 = CASE 
                 WHEN LOS0.parent_prop_id = 'BEAE885B' 
                    THEN STUFF((SELECT '|' + LOS1.element_value 
                                FROM ListOfString LOS1
                                WHERE LOS0.parent_prop_id = LOS1.parent_prop_id
                                ORDER BY LOS0.parent_prop_id
                                FOR XML PATH('')), 1, LEN(','), '')
                    ELSE '' 
               END
FROM 
    ListOfString LOS0
GROUP BY 
    LOS0.parent_id, LOS0.parent_prop_id

有什么想法可以将这两行包含在同一行中吗? 如果我通过 parent_prop_id 删除该组,我会收到以下消息: 列 'ListOfString.parent_prop_id' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。

谢谢

抱歉,我的格式不正确。

马丁

【问题讨论】:

    标签: sql-server tsql group-by


    【解决方案1】:

    稍微修改您当前的解决方案,您所需要的只是另一个级别的聚合。如果您从case expression 中删除else 子句,您可以进一步按parent_id 分组,并通过聚合string1string2 来删除空值

    select parent_id, Max(String1) String1, Max(String2) String2 from (
        select LOS0.parent_id,
        case LOS0.parent_prop_id
            when '1DC045A5' then 
                Stuff((
                select '|' + LOS1.element_value 
                from ListOfString LOS1
                where LOS0.parent_prop_id = LOS1.parent_prop_id
                order by LOS0.parent_prop_id
                for xml path('')), 1, 1, '')
            end as String1,
        case LOS0.parent_prop_id
            when 'BEAE885B' then 
                Stuff((
                select '|' + LOS1.element_value 
                from ListOfString LOS1
                where LOS0.parent_prop_id = LOS1.parent_prop_id
                order by LOS0.parent_prop_id
                for xml path('')), 1, 1, '')
        end as String2
        from ListOfString LOS0
    )los
    group by parent_id
    

    Example Fiddle

    【讨论】:

      【解决方案2】:

      在较新版本的 SQL Server 中,您将使用 string_agg()。等一下。 SQL Server 确实支持这一点。

      但是你可以用条件聚合来模拟它:

      select parent_id,
             string_agg(case when seqnum_p = 1 then parent_prop_id end, '|'),
             string_agg(case when seqnum_e = 1 then element_value end, '|')
      from (select t.*,
                   row_number() over (partition by parent_id, parent_prop_id order by  parent_prop_id) as seqnum_p,
                   row_number() over (partition by parent_id, element_value order by element_value) as seqnum_e
            from t
           ) t
      group by parent_id;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        相关资源
        最近更新 更多