声明国家/地区列表并根据国家/地区提供值

时间:2020-09-10 20:11:33

标签: sql sql-server tsql

我有两个问题。我有一张大桌子用于市场营销活动。我想创建一个表来呈现买方国家的关税编号。由于我的国家/地区列表每季度都会更改一次,因此我想将它们放入clarify / Set语句中。 您如何在Declare语句中使用字符串值?有没有更好的办法?我尝试了各种方法,用逗号,单引号,以下列表中没有引号的方法:( ' ”AU” , ”GB” , ”NZ” ')

在Select语句中使用更多动态SQL时,是否有更好的方法? 这是我到目前为止尝试过的:

DECLARE @tariff_1  varchar(100)
SET @tariff_1 = ( ' ”AU” , ”GB” ,  ”NZ” ')      
DECLARE @tariff_2  varchar(100)
SET @tariff_2 = ( '"GB" , "US" , "GB" ')
DECLARE @tariff_3  varchar(100)
SET @tariff_3 = ( '"CH" , "US" , "JE" ')    

SELECT
         a.[Product_1] 
        ,a.[Product_2] 
        ,a.[Product_3] 
        ,a.[Product_4] 
        ,a.[Product_5] 
    
        ,CASE WHEN a.[Product_1]  IN (@tariff_1)  THEN '3'    ELSE '999' END AS 'Buyer_country1'
        ,CASE WHEN a.[Product_2]  IN (@tariff_2)  THEN '3.5'   ELSE '999' END AS 'Buyer_country2'
        ,CASE WHEN a.[Product_3]  IN (@tariff_2)  THEN '4'      ELSE '999' END AS 'Buyer_country3'
            FROM  [IDW_stage_DEV].[dbo].[table] a

该表如下所示:

Product_1 Product_2 Product_3 Product_4 Product_5 Buyer_country1 Buyer_country2
-------------------------------------------------------------------------------
AU        GB        NULL      NULL      NULL      999            999
GB        US        JE        NULL      NULL      999            999
AU        GB        US        NULL      NULL      999            999
  • “ Buyer_country1”应在所有3个实例中返回3。
  • “ Buyer_country2”在所有3个实例中均应返回3.5。
  • “ Buyer_country3”应在第一列中返回999,然后在其余两列中返回4。

另外,根据上面的结果,我还需要创建一个变量,该变量将为我提供关税价格最高的国家。

  • 对于第1行 新创建的变量“ highest_tariff_paid”应呈现为:GB

  • 对于第2行 新创建的变量“ highest_tariff_paid”应呈现为:JE

  • 对于第3行 新创建的变量“ highest_tariff_paid”应呈现为:美国

您可以这样做而不破坏选择查询吗?那怎么办?

1 个答案:

答案 0 :(得分:3)

使用表变量:

DECLARE @tariff_1 TABLE (Code VARCHAR(100));
INSERT INTO @tariff_1 (Code) VALUES ('AU'), ('GB'), ('NZ');     
DECLARE @tariff_2 TABLE (Code VARCHAR(100));
INSERT INTO @tariff_2 (Code) VALUES ('GB'), ('US'), ('GB');
DECLARE @tariff_3 TABLE (Code VARCHAR(100));
INSERT INTO @tariff_3 (Code) VALUES ('CH'), ('US'), ('JE'); 

SELECT
    a.[Product_1] 
    , a.[Product_2] 
    , a.[Product_3] 
    , a.[Product_4] 
    , a.[Product_5] 

    , CASE WHEN a.[Product_1] IN (SELECT Code from @tariff_1) THEN '3' ELSE '999' END AS 'Buyer_country1'
    , CASE WHEN a.[Product_2] IN (SELECT Code from @tariff_2) THEN '3.5' ELSE '999' END AS 'Buyer_country2'
    , CASE WHEN a.[Product_3] IN (SELECT Code from @tariff_2) THEN '4' ELSE '999' END AS 'Buyer_country3'
FROM [IDW_stage_DEV].[dbo].[table] a