SQL Server:基于列的子串返回Group By的结果

时间:2016-02-08 21:01:58

标签: sql-server group-by cursor substring resultset

有关此问题的更多背景信息,请参阅here

我有一个使用GROUP BY和子字符串

的查询
    use thedatabase;

    declare @fromDate datetime = '2016-02-01 00:00:00.000';
    declare @toDate datetime = '2016-02-02 23:59:59.999';
    declare @source varchar(15) = 'server001';

    DECLARE @countForType bigint;
    DECLARE @totalForType decimal(30,8);

    DECLARE @country varchar(10);

    SELECT  @countForType = count(*),
            @totalForType = SUM(typeTable.amount),
            @country = 
                case
                when (charindex('[', typeTable.source) > 0 and charindex(']', typeTable.source) > 0)
                then substring(typeTable.source, charindex('[', typeTable.source) +1, (charindex(']', typeTable.source) - 1) - charindex('[', typeTable.source))
                else null
                end
    FROM 
        theTypeTable typeTable (nolock)
    WHERE 
        typeTable.startDate > @fromDate
        AND typeTable.startDate < @toDate
        AND typeTable.source like @source 
    GROUP BY                     
        case
            when (charindex('[', typeTable.source) > 0 and charindex(']', typeTable.source) > 0)
            then substring(typeTable.source, charindex('[', typeTable.source) +1, (charindex(']', typeTable.source) - 1) - charindex('[', typeTable.source))
            else null
        end

我希望能够将其转换为报告格式,方法是循环并使用PRINT打印出值或将其全部放在结果集中。要么没事。

通过研究,我可以在这里做两件事来编写报告:

  1. 使用光标并遍历结果,打印值。我不知道该怎么做。

  2. 删除标量变量并让此查询返回结果集。我在下面做了这个。下面是重写的查询。但是,它只返回一行。

  3. 返回一行:

    Select  count(*) as countForType, 
            SUM(typeTable.amount) as totalForType, 
            case
                when (  charindex('[', typeTable.source) > 0 and 
                        charindex(']', typeTable.source) > 0)
                then substring( typeTable.source, 
                                charindex('[', typeTable.source) +1, 
                                (charindex(']', typeTable.source) - 1) - charindex('[', typeTable.source))
                else null
            end
            as country
    
    FROM theTypeTable typeTable (nolock)
    WHERE typeTable.startDate > @fromDate
      AND typeTable.startDate < @toDate
      AND typeTable.source like @source 
    GROUP BY 
        case
            when (  charindex('[', typeTable.source) > 0 and 
                        charindex(']', typeTable.source) > 0)
                then substring( typeTable.source, 
                                charindex('[', typeTable.source) +1, 
                                (charindex(']', typeTable.source) - 1) - charindex('[', typeTable.source))
                else null
            end
    

    返回类似的内容:

    countForType    totalForType    country
    =========================================
    590             82983909        NULL
    

    理想情况下,我想要一个结果集或打印输出的报告,其中包含以下信息:

    countForType: 104
    totalForType: 110000.00000000
    
    country: en-US
    countForType: 55
    totalForType: 95000.00000000
    
    country: de-CH
    countForType: 25
    totalForType: 5000.00000000
    
    country: tr-TR
    countForType: 30
    totalForType: 10000.00000000
    

1 个答案:

答案 0 :(得分:0)

我会说你可以使用一些脚本,比如

SELECT  'countForType: ' & count (*) + '
totalForType: ' & SUM(typeTable.amount) as totalForType 
FROM 
....

在行中的最后一个撇号之后,我按下了回车键,这将使行更改为查询的一部分。

在文本模式下执行查询,先按Ctrl + T,然后希望得到结果。