根据不同的公式计算行值

时间:2019-08-17 06:03:50

标签: sql-server tsql

我想基于每一行中的给定公式来计算单元格值。

输入记录为:

Row level formula table

预期输出为:

Expected output

3 个答案:

答案 0 :(得分:1)

第一件事是您的公式不正确。据我了解,每个sl都有一个唯一的行。要做sumcol1中的col2,正确的公式是(col1 + col2)。所以先纠正一下。

之后,您可以使用动态sql作为实现

create table tab_sum ( id int, col1 int, col2 int, col varchar(max) )

insert into tab_sum ( id, col1, col2, col )
values ( 1, 3, 5, '(col1 + col2)' )
, ( 2, 4, 6, '(col1 + col2)' )


DECLARE @query NVARCHAR(MAX) = '';

WITH CTE_DistinctFormulas AS 
(
    SELECT DISTINCT col as Formula FROM tab_sum
)
SELECT @query = @query + '
UNION ALL 
SELECT id, col1, col2, col, ' + Formula + ' AS CalcValue FROM tab_sum WHERE col = ''' + Formula + ''' ' 
FROM CTE_DistinctFormulas;
SET @query = STUFF(@query,1,12,'');

PRINT @query;

EXEC (@query);

或者如果您不希望编辑公式,则可以尝试执行此操作,但是请确保每个id及其相应的值只有一行,否则它将所有相似的行合计为一。

create table tab_sum ( id int, col1 int, col2 int, col varchar(max) )

insert into tab_sum ( id, col1, col2, col )
values ( 1, 3, 5, 'sum(col1 + col2)' )
, ( 2, 4, 6, 'sum(col1 + col2)' )


DECLARE @query NVARCHAR(MAX) = '';

WITH CTE_DistinctFormulas AS 
(
    SELECT DISTINCT col as Formula FROM tab_sum
)
SELECT @query = @query + '
UNION ALL 
SELECT id, col1, col2, col, ' + Formula + ' AS CalcValue FROM tab_sum WHERE col = ''' + Formula + ''' group by id, col1, col2, col ' 
FROM CTE_DistinctFormulas;
SET @query = STUFF(@query,1,12,'');

PRINT @query;

EXEC (@query);

答案 1 :(得分:0)

您看过case /表达式了吗?请参阅MS doc:CASE

所以您的查询就像:

SELECT sl, audience_1, audience_2, audience_3,
   CASE WHEN audience_3 > 0 THEN audience_1 + audience_3
        ELSE audience_1 + audience_2
        END audience_total
FROM audience
;

您没有提供标准,所以我不得不猜测:-)

(由于我没有方便的服务器,所以我没有运行查询:-))

OP发表评论后进行更新:

如果同一表中的受众群体有71个不同的列,那么问题就不同了。

那么我的解决方法是:

  • 使用sl将受众群体编号拆分到详细信息表中, audience_type和Audience_count
  • 使用两列audience_calc_configcalc_method创建一个audience_type
  • 对于每个不同的计算和受众类型,在上面添加一个条目 桌子
  • 从原始表中删除公式并替换为适当的 calc_method
  • 然后使用JOINGROUP BY slSUM(audience)进行简单选择
  • (当然,将Audience_calc拆分为一个 主/细节,因此您可以拥有外键...)

答案 2 :(得分:0)

我认为您想要这样的东西:

select *,case when row_cal like '%1%' and  row_cal like '%2%'  then value1 + value2 
                        when row_cal like '%1%' and  row_cal like '%3%'  then value1 + value3
                      end as result from YourTable