SQL聚合一行中具有不同名称的行

时间:2015-12-04 14:54:48

标签: sql

我有一个CTE,它返回以下几个连接的结果:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group
        android:id="@+id/nav_header"
        android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:checked="true"
            android:icon="@drawable/ic_home_black_24dp"
            android:title="Home" />
        <item
            android:id="@+id/nav_search"
            android:icon="@drawable/ic_search_black"
            android:title="Search Location" />
        <item
            android:id="@+id/nav_fav"
            android:icon="@drawable/ic_favorite"
            android:title="Favorites" />
        <item
            android:id="@+id/nav_recent"
            android:icon="@drawable/ic_nav_route"
            android:title="Recent Location" />
        <item
            android:id="@+id/nav_route"
            android:icon="@drawable/ic_place"
            android:title="Route" />
    </group>


    <item
        android:id="@+id/navigation_subheader"
        android:title="Others">
        <menu>
            <item
                android:id="@+id/nav_settings"
                android:checkable="true"
                android:icon="@drawable/ic_settings"
                android:title="Settings" />
            <item
                android:checkable="true"
                android:id="@+id/nav_about"
                android:icon="@android:drawable/ic_menu_send"
                android:title="About" />
        </menu>
    </item>

</menu>

基本上他们按城市和岛屿返回一些值,我想按照以下规则加入一行中某些岛屿的值:

Madeira = Ilha de Porto Santo + Ilha da Madeira

Açores=

    city            Value1  Value2
    Aveiro          83  1624
    Beja            6   83
    Braga           70  1751
    Bragança        8   165
    Castelo Branco      7   206
    Coimbra         32  573
    Évora           14  173
    Faro            181 3284
    Guarda          2   106
    Ilha da Graciosa    39  92
    Ilha da Madeira 520 3339
    Ilha das Flores 53  154
    Ilha de Porto Santo 46  107
    Ilha de Santa Maria 114 140
    Ilha de São Jorge   31  116
    Ilha de São Miguel  306 2582
    Ilha do Corvo       7   12
    Ilha do Faial       90  217
    Ilha do Pico        123 167
    Ilha Terceira       205 493
    Leiria          82  1167
    Lisboa          301 8833
    Portalegre      11  201
    Porto           333 5966
    Santarém        39  973
    Setúbal         90  2229
    Viana do Castelo    24  435
    Vila Real       30  473
    Viseu           40  640

输出应为:

Ilha da Graciosa
Ilha das Flores
Ilha de Santa Maria
Ilha de São Jorge
Ilha de São Miguel
Ilha do Corvo
Ilha do Faial
Ilha do Pico
Ilha Terceira

我使用FOR XML PATH尝试基于相同帖子的几个想法,但我无法重现期望结果。

我没有可以在GROUP中使用的任何ID,因为Island有自己的ID 任何人都可以帮助我吗?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用case

select (case when city in ('Ilha de Porto Santo', 'Ilha da Madeira')
             then 'Madeira'
             when city in ('Ilha da Graciosa', 'Ilha das Flores', 'Ilha de Santa Maria',
                           'Ilha de São Jorge', 'Ilha de São Miguel', 'Ilha do Corvo',
                           'Ilha do Faial', 'Ilha do Pico', 'Ilha Terceira')
             then 'Açores'
             else city
        end) as city
       sum(Value1) as value1, sum(Value2) as value2
from cte
group by (case when city in ('Ilha de Porto Santo', 'Ilha da Madeira')
               then 'Madeira'
               when city in ('Ilha da Graciosa', 'Ilha das Flores', 'Ilha de Santa Maria',
                             'Ilha de São Jorge', 'Ilha de São Miguel', 'Ilha do Corvo',
                             'Ilha do Faial', 'Ilha do Pico', 'Ilha Terceira')
               then 'Açores'
               else city
          end);
嗯,考虑到这一点,你应该定义一个具有&#34;详细城市的参考表&#34;以及&#34;报告城市&#34;。这将使得将来更容易维护代码 - 关于组合内容的规则将在表格中(易于更改)而不是代码中(更难以更改)。