4

我有一个简单的查询。像这样的东西:

SELECT l.list_name, COUNT(order_id) 
FROM orders o JOIN lists l ON l.order_id=o.order_id 
    WHERE l.list_name LIKE 'orders_1%' or l.list_name LIKE 'orders_2%'
GROUP BY l.list_name

情况看起来像这样:一个存储过程正在更新列表表,但如果有超过 1000 个订单,它会部分地切割列表。

如果我有 1200 个带有标准或列表“orders_1”的订单,那么我的程序将创建两个列表:“orders_1_1”和“orders_1_2”,第一个有 1,000 个订单,第二个有 200 个订单。

因此,当我运行查询来计算这些订单时,我会得到如下结果:

list_name                  count

orders_1                   100
orders_1_more_than_100_1   1000       
orders_1_more_than_100_2   200
orders_2                   400 
orders_3_1                 1000       
orders_3_2                 1000
orders_3_3                 420  
orders_3_more_than_100_1   1000       
orders_3_more_than_100_2   900
orders_3_more_than_200_1   1000       
orders_3_more_than_200_2   1000
orders_3_more_than_200_3   100      
orders_4                   200
orders_4_more_than_300     200 

我想得到的结果应该是这样的:

list_name                  count

orders_1                   100
orders_1_more_than_100     1200       
orders_2                   400 
orders_3                   2420 
orders_3_more_than_100     1900 
orders_3_more_than_200     2100     
orders_4                   200 
orders_4_more_than_300     200 

这样它将汇总所有开头相同的列表。

有什么想法吗?:)

这些是我在 list_names 列中的确切值:

WYS_AUT_PISMO_NR_6
WYS_AUT_PISMO_NR_5_POWYZEJ_240
WYS_AUT_PISMO_NR_5_DO_240
WYS_AUT_PISMO_NR_4_POWYZEJ_240_5
WYS_AUT_PISMO_NR_4_POWYZEJ_240_4
WYS_AUT_PISMO_NR_4_POWYZEJ_240_3
WYS_AUT_PISMO_NR_4_POWYZEJ_240_2
WYS_AUT_PISMO_NR_4_POWYZEJ_240_1
WYS_AUT_PISMO_NR_4_DO_240
WYS_AUT_PISMO_NR_3_POWYZEJ_240
WYS_AUT_PISMO_NR_3_DO_240
WYS_AUT_PISMO_NR_2_POWYZEJ_240
WYS_AUT_PISMO_NR_2_DO_240
WYS_AUT_PISMO_NR_1

我想要的是像这样对它们进行分组:

WYS_AUT_PISMO_NR_6
WYS_AUT_PISMO_NR_5_POWYZEJ_240
WYS_AUT_PISMO_NR_5_DO_240
WYS_AUT_PISMO_NR_4_POWYZEJ_240 /*here I must group those 5 lists*/
WYS_AUT_PISMO_NR_4_DO_240
WYS_AUT_PISMO_NR_3_POWYZEJ_240
WYS_AUT_PISMO_NR_3_DO_240
WYS_AUT_PISMO_NR_2_POWYZEJ_240
WYS_AUT_PISMO_NR_2_DO_240
WYS_AUT_PISMO_NR_1
4

2 回答 2

2

尝试类似的东西

    select substring(l.list_name, 0, 8), count(order_Id)
    FROM orders o JOIN lists l ON l.order_id=o.order_id  
    WHERE l.list_name LIKE 'orders_1%' or l.list_name LIKE 'orders_2%'        
    group by substring(l.list_name, 0, 8)

更新问题的更新答案:

     select newColName, COUNT(order_id)
     from 
     (
          select case when GetSubstringCount(l.list_name, '_', '') > 1 then 
        SUBSTRING(l.list_name, 0, len(l.list_name) - 2)
        else l.list_name end as NewColName
        , order_Id
          FROM orders o JOIN lists l ON l.order_id=o.order_id       
          WHERE l.list_name LIKE 'orders_1%' or l.list_name LIKE 'orders_2%'           
     ) mySubTable 
     group by newColName

您需要类似This来创建 GetSubstringCount 方法

于 2012-04-20T08:01:11.657 回答
2

_如果有多个下划线,这个可怕的表达式将从参数的开头到最后一个字符串隔离:

select case when len (l.list_name) - len (replace (l.list_name, '_', '')) > 1 
            then left(l.list_name, 
                      len (l.list_name) - charindex('_', reverse(l.list_name)))
            else l.list_name
        end

或者,您可以从字符串中删除 'orders_',将下划线替换为点并将其转换为浮点数,然后转换为 int 以删除小数,然后使用此怪物返回字符串:

select 'orders_' + cast (cast (cast (
        replace (substring (@str, 8, 100), '_', '.') 
        as float) as int) as varchar(100))

为避免重复此 blob,请使用派生表而不是lists

SELECT l.TrimmedListName, COUNT(order_id) 
FROM orders o 
JOIN 
(
   select lists.*,
       -- Remove optional list continuation number
          case when len (list_name) - len (replace (list_name, '_', '')) > 1 
                then left(list_name, 
                          len (list_name) - charindex('_', reverse(list_name)))
                else list_name
            end AS TrimmedListName
     from lists
) l ON l.order_id=o.order_id 
WHERE (l.list_name LIKE 'orders_1%' or l.list_name LIKE 'orders_2%')
GROUP BY l.TrimmedListName
于 2012-04-20T08:31:58.313 回答