【问题标题】:Multiple data values into one item in Cognos在 Cognos 中将多个数据值合并为一项
【发布时间】:2022-07-15 22:43:19
【问题描述】:

我遇到的问题是,我希望每个城市代码都在一行中,而不是多行。我希望在查询端完成此操作。 我曾尝试在 city_name 列上使用中继器,但它不起作用...

city_code city_sequence city_name
3051715 1 London
3051715 2 New York
3051715 3 San Francisco
stock_code stock_note
3051715 London, New York, San Francisco

谢谢,

【问题讨论】:

    标签: sql cognos


    【解决方案1】:

    如果您确实必须在查询中执行此操作,则需要在创建数据项之前知道 city_sequence 的最大值。您将使用以下案例语句将结果预置为列(city1、city2、city3 等):

    case
      when [city_sequence] = 1
        then [city_name]
    end
    

    将详细信息聚合设置为最大值。

    如果您拥有比预期更多的城市,您会错过一些。
    祝你好运,逗号正确。

    没有看到您收到的错误消息,我无能为力。但是我通常发现我不需要在查询中这样做。

    我使用 1 行 x 列的中继器表(不是中继器)完成了这项工作。您需要知道(或估计)一行中的最大值数,并确保在转发器表中至少有那么多列。中继器表中的列数可以超出您的需要。

    这是一个示例报告规范:

    <report xmlns="http://developer.cognos.com/schemas/report/15.5/" expressionLocale="en-us" useStyleVersion="11.4">
        <!--RSU-SPC-0093 The report specification was upgraded from "http://developer.cognos.com/schemas/report/14.3/" to "http://developer.cognos.com/schemas/report/15.5/" at 2021-3-25. 18:9:49-->
        <drillBehavior/>
        <layouts>
            <layout>
                <reportPages>
                    <page name="Page1">
                        <style>
                            <defaultStyles>
                                <defaultStyle refStyle="pg"/>
                            </defaultStyles>
                        </style>
                        <pageBody>
                            <style>
                                <defaultStyles>
                                    <defaultStyle refStyle="pb"/>
                                </defaultStyles>
                            </style>
                            <contents>
                                <list horizontalPagination="true" name="List1" refQuery="Query3">
                                    <noDataHandler>
                                        <contents>
                                            <block>
                                                <contents>
                                                    <textItem>
                                                        <dataSource>
                                                            <staticValue>No Data Available</staticValue>
                                                        </dataSource>
                                                        <style>
                                                            <CSS value="padding:10px 18px;"/>
                                                        </style>
                                                    </textItem>
                                                </contents>
                                            </block>
                                        </contents>
                                    </noDataHandler>
                                    <style>
                                        <CSS value="border-collapse:collapse"/>
                                        <defaultStyles>
                                            <defaultStyle refStyle="ls"/>
                                        </defaultStyles>
                                    </style>
                                    <listColumns>
                                        <listColumn>
                                            <listColumnTitle>
                                                <style>
                                                    <defaultStyles>
                                                        <defaultStyle refStyle="lt"/>
                                                    </defaultStyles>
                                                </style>
                                                <contents>
                                                    <textItem>
                                                        <dataSource>
                                                            <dataItemLabel refDataItem="Country"/>
                                                        </dataSource>
                                                    </textItem>
                                                </contents>
                                            </listColumnTitle>
                                            <listColumnBody>
                                                <style>
                                                    <defaultStyles>
                                                        <defaultStyle refStyle="lc"/>
                                                    </defaultStyles>
                                                </style>
                                                <contents>
                                                    <textItem>
                                                        <dataSource>
                                                            <dataItemValue refDataItem="Country"/>
                                                        </dataSource>
                                                    </textItem>
                                                </contents>
                                            </listColumnBody>
                                        </listColumn>
                                        <listColumn>
                                            <listColumnTitle>
                                                <style>
                                                    <defaultStyles>
                                                        <defaultStyle refStyle="lt"/>
                                                    </defaultStyles>
                                                </style>
                                                <contents>
                                                    <textItem>
                                                        <dataSource>
                                                            <staticValue>Retailer Type</staticValue>
                                                        </dataSource>
                                                    </textItem>
                                                </contents>
                                            </listColumnTitle>
                                            <listColumnBody>
                                                <style>
                                                    <defaultStyles>
                                                        <defaultStyle refStyle="lc"/>
                                                    </defaultStyles>
                                                </style>
                                                <contents>
                                                    <repeaterTable across="20" down="1" name="Repeater table1" refQuery="Query2">
                                                        <repeaterTableCell>
                                                            <contents>
                                                                <textItem>
                                                                    <dataSource>
                                                                        <dataItemValue refDataItem="Retailer type"/>
                                                                    </dataSource>
                                                                </textItem>
                                                                <textItem>
                                                                    <dataSource>
                                                                        <dataItemValue refDataItem="Comma"/>
                                                                    </dataSource>
                                                                </textItem>
                                                            </contents>
                                                            <style>
                                                                <defaultStyles>
                                                                    <defaultStyle refStyle="rc"/>
                                                                </defaultStyles>
                                                                <CSS value="padding:0px;font-size:8pt"/>
                                                            </style>
                                                        </repeaterTableCell>
                                                        <style>
                                                            <CSS value="border-collapse:collapse"/>
                                                            <defaultStyles>
                                                                <defaultStyle refStyle="rt"/>
                                                            </defaultStyles>
                                                        </style>
                                                        <masterDetailLinks>
                                                            <masterDetailLink>
                                                                <masterContext>
                                                                    <dataItemContext refDataItem="Country"/>
                                                                </masterContext>
                                                                <detailContext>
                                                                    <dataItemContext refDataItem="Country"/>
                                                                </detailContext>
                                                            </masterDetailLink>
                                                        </masterDetailLinks>
                                                    </repeaterTable>
                                                </contents>
                                            </listColumnBody>
                                        </listColumn>
                                        <listColumn>
                                            <listColumnTitle>
                                                <style>
                                                    <defaultStyles>
                                                        <defaultStyle refStyle="lt"/>
                                                    </defaultStyles>
                                                </style>
                                                <contents>
                                                    <textItem>
                                                        <dataSource>
                                                            <dataItemLabel refDataItem="Quantity"/>
                                                        </dataSource>
                                                    </textItem>
                                                </contents>
                                            </listColumnTitle>
                                            <listColumnBody>
                                                <style>
                                                    <defaultStyles>
                                                        <defaultStyle refStyle="lm"/>
                                                    </defaultStyles>
                                                </style>
                                                <contents>
                                                    <textItem>
                                                        <dataSource>
                                                            <dataItemValue refDataItem="Quantity"/>
                                                        </dataSource>
                                                    </textItem>
                                                </contents>
                                            </listColumnBody>
                                        </listColumn>
                                    </listColumns>
                                </list>
                            </contents>
                        </pageBody>
                        <XMLAttributes>
                            <XMLAttribute output="no" name="RS_legacyDrillDown" value="0"/>
                        </XMLAttributes>
                    </page>
                </reportPages>
            </layout>
        </layouts>
        <XMLAttributes>
            <XMLAttribute output="no" name="RS_CreateExtendedDataItems" value="true"/>
            <XMLAttribute output="no" name="listSeparator" value=","/>
            <XMLAttribute output="no" name="decimalSeparator" value="."/>
            <XMLAttribute output="no" name="RS_modelModificationTime" value="2015-11-25T21:38:24.820Z"/>
        </XMLAttributes>
        <modelPath>/content/folder[@name=&apos;Samples&apos;]/folder[@name=&apos;Models&apos;]/package[@name=&apos;GO sales (query)&apos;]/model[@name=&apos;model&apos;]</modelPath>
        <queries>
            <query name="Query1">
                <source>
                    <model/>
                </source>
                <selection>
                    <dataItem aggregate="none" name="Country" rollupAggregate="none" sort="ascending">
                        <expression>[Sales (query)].[Branch].[Country]</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="3"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value="attribute"/>
                        </XMLAttributes>
                    </dataItem>
                    <dataItem aggregate="none" name="Retailer type" rollupAggregate="none" sort="ascending">
                        <expression>[Sales (query)].[Retailer type].[Retailer type]</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="3"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value="attribute"/>
                        </XMLAttributes>
                    </dataItem>
                    <dataItem aggregate="total" name="Quantity">
                        <expression>[Sales (query)].[Sales].[Quantity]</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="1"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value="fact"/>
                        </XMLAttributes>
                    </dataItem>
                </selection>
                <detailFilters>
                    <detailFilter>
                        <filterExpression>[Sales (query)].[Time].[Year] = 2013</filterExpression>
                    </detailFilter>
                </detailFilters>
            </query>
            <query name="Query2">
                <source>
                    <queryRef refQuery="Query1"/>
                </source>
                <selection>
                    <dataItem aggregate="none" name="Country" rollupAggregate="none">
                        <expression>[Query1].[Country]</expression>
                    </dataItem>
                    <dataItem aggregate="none" name="Retailer type" rollupAggregate="none">
                        <expression>[Query1].[Retailer type]</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="3"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value="0"/>
                        </XMLAttributes>
                    </dataItem>
                    <dataItem name="Comma">
                        <expression>case
        when running-count ([Retailer type] for [Country]) &lt; maximum (running-count ([Retailer type] for [Country]) for [Country]) then &apos;,&apos;
        else &apos;&apos;
    end</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="3"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value=""/>
                        </XMLAttributes>
                    </dataItem>
                </selection>
            </query>
            <query name="Query3">
                <source>
                    <queryRef refQuery="Query1"/>
                </source>
                <selection>
                    <dataItem aggregate="none" name="Country" rollupAggregate="none">
                        <expression>[Query1].[Country]</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="3"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value="0"/>
                        </XMLAttributes>
                    </dataItem>
                    <dataItem aggregate="total" name="Quantity">
                        <expression>[Query1].[Quantity]</expression>
                        <XMLAttributes>
                            <XMLAttribute name="RS_dataType" output="no" value="2"/>
                            <XMLAttribute name="RS_dataUsage" output="no" value="2"/>
                        </XMLAttributes>
                    </dataItem>
                </selection>
            </query>
        </queries>
        <reportName>Repeater Table (using Samples data)</reportName>
    </report>
    

    【讨论】:

      【解决方案2】:

      根据数据库,使用类似 listagg 的函数 或 xmlagg

      https://www.ibm.com/docs/en/db2/11.5?topic=functions-listagg

      对于指定的度量,LISTAGG 对 ORDER BY 子句中指定的每个组中的数据进行排序,然后连接度量列的值

      例如,

      SELECT LISTAGG(trim(City_Name),',') FROM MyTable
      

      另一个 stackoverflow 链接可能会有所帮助

      How to concatenate text from multiple rows into a single text string in SQL Server

      【讨论】:

        猜你喜欢
        • 2021-09-15
        • 2020-07-28
        • 2019-05-02
        • 2014-05-15
        • 2020-03-03
        • 1970-01-01
        • 2012-09-09
        • 2017-12-02
        • 2016-12-06
        相关资源
        最近更新 更多