【问题标题】:SQL Server : collapse text rows into one or more rowsSQL Server:将文本行折叠成一行或多行
【发布时间】:2015-12-23 07:13:36
【问题描述】:

我正在尝试折叠维护层次结构的表。

我使用的是 SQL Server 2008 R2。

数据看起来像这样。 ID 是唯一的:

ID  Country City        District            Street          amount
------------------------------------------------------------------
1   USA     New York    NULL                NULL            1
1   USA     New York    Manhattan           NULL            1
2   EU      Paris       NULL                NULL            1
2   EU      Paris       arrondissement II   NULL            1
2   EU      Paris       arrondissement II   Rue Vivienne    1
2   EU      Paris       arrondissement IV   NULL            1
2   EU      Paris       arrondissement IV   Rue de Rivoli   1

到这里:

ID  Country City      District          Street        amount
------------------------------------------------------------
1   USA     New York  Manhattan         NULL            1
2   EU      Paris     arrondissement II Rue Vivienne    1
2   EU      Paris     arrondissement IV Rue de Rivoli   1

示例代码:

create table DataTab
(
    ID  [varchar](10),
    Country [varchar](10),
    City [varchar](10),
    District [varchar](50),
    Street [varchar](50),
    amount [int]
);

Insert into DataTab
values (1, 'USA', 'New York', NULL, NULL, 1);

Insert into DataTab
values (1, 'USA', 'New York', 'Manhattan', NULL, 1);

Insert into DataTab
values (2, 'EU', 'Paris', NULL, NULL, 1);

Insert into DataTab
values (2, 'EU', 'Paris', 'arrondissement II', NULL, 1);

Insert into DataTab
values (2, 'EU', 'Paris', 'arrondissement II', 'Rue Vivienne', 1);

Insert into DataTab
values (2, 'EU', 'Paris', 'arrondissement IV', NULL, 1);

Insert into DataTab
values (2, 'EU', 'Paris', 'arrondissement IV', 'Rue de Rivoli', 1);

select * from DataTab;

我尝试使用 CTE 解决问题,但不知何故我找不到可行的解决方案。

希望您有时间提供帮助。

【问题讨论】:

  • 使用CTE显示您的查询。
  • 当有 5 行 ID 为 2 时,“ID 是唯一的”是什么意思?

标签: sql-server select sql-server-2008-r2 hierarchy collapse


【解决方案1】:

这可能不是解决此类问题的标准方法,但请尝试以下查询:

SELECT ID
    ,Country
    ,City
    ,District
    ,Street
    ,amount
FROM (
    SELECT *
        ,max(score) OVER (PARTITION BY id) max_score
    FROM (
        SELECT *
            ,CASE WHEN Country IS NOT NULL THEN 1 ELSE 0 END + 
             CASE WHEN City IS NOT NULL THEN 1 ELSE 0 END + 
             CASE WHEN District IS NOT NULL THEN 1 ELSE 0 END + 
             CASE WHEN Street IS NOT NULL THEN 1 ELSE 0 END + 
             CASE WHEN amount IS NOT NULL THEN 1 ELSE 0 END score
        FROM DataTab
        ) result_set
    GROUP BY ID
        ,Country
        ,City
        ,District
        ,Street
        ,amount
        ,score
    ) result_set
WHERE score = max_score

您还可以找到示例SQLFiddle here

【讨论】:

  • 这很有魅力。非常感谢您花时间帮助我。
  • @Kirsten 不客气,这就是我们在这里的原因#SOreadytohelp
猜你喜欢
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多