【问题标题】:Selecting Case statement in SQL Server在 SQL Server 中选择 Case 语句
【发布时间】:2017-04-25 19:44:48
【问题描述】:

我正在尝试使用 SQL Server 将 case 语句添加到我的查询中。我有一个很长的查询,我基本上选择了一个临时表#Step1,给出了下表。

+---+------------+-------------+-----------------+---------------+
|   |     LOB    | TechPrem    |  Label          |  Data         |
+---+------------+-------------+-----------------+---------------+
| 1 | AOP        | Yes         |  ADjAAL         |    40331      |
| 1 | Boiler     | Yes         |  AdjAAL         |     0         |
| 1 | TRIA       | NO          |  AdjAAL         |     0         |
| 1 | AOP        | Yes         |  PureAAL        |    11904      |
| 1 | Boiler     | Yes         |  PureAAL        |     775       |
+---+------------+-------------+---------------- +---------------+ 

我的疑问是,查看上表,我想选择一个案例语句,如果 AOP 和锅炉的“TechPrem”为“是”,那么我的查询 1 应该执行,否则如果“TechPrem”为“ No' 对于 AOP & Boiler,则应执行查询 2。对此的任何建议或想法都会有所帮助

查询1:

 SELECT  
     FileID, 
     SUM(CAST(REPLACE(Data,',','.') AS FLOAT)) AS Summed_AAL_Attri
FROM 
    (SELECT 
         *, 
         ROW_NUMBER() OVER (PARTITION BY FileID, "LOB" ORDER BY "Label" ASC) AS rn
     FROM 
         DATA WITH (NOLOCK)  
     WHERE
         Label IN ('AdjAAL') 
         AND LOB IN ('AOP', 'Boiler', 'TRIA')) AS t
WHERE
    t.rn = 1
    AND FileID = 1
GROUP BY 
    FileID

“是”的预期答案:403301

查询2:

SELECT  
    FileID, 
    SUM(CAST(REPLACE(Data,',','.') AS FLOAT)) AS Summed_AAL_Attri
FROM 
    (SELECT 
         *, 
         row_number() over (partition by FileID, "LOB" ORDER BY "Label" ASC) as rn
     FROM 
         DATA WITH (NOLOCK)  
     WHERE 
         Label IN ('AdjAAL','PureAAL') 
         AND LOB IN ('AOP', 'Boiler', 'TRIA')) AS t
WHERE
    t.rn = 1
    AND FileID = 1
GROUP BY 
    FileID

“否”时的预期答案:41106

【问题讨论】:

  • 那些 ROW_NUMBER 函数将无法正常工作,因为那里有字符串文字。取出引号。在继续使用 NOLOCK 乱扔查询之前,您还应该看看这篇文章。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere至于手头的问题……我根本不明白你想要什么。而且您的预期输出甚至与样本中的数据不匹配。
  • 我不清楚问题
  • @Paparazzi 也不是我。这个问题太牛了!

标签: sql sql-server tsql


【解决方案1】:

SQL Server 不支持基于 case 运行不同的查询,但是由于我在子查询的 WHERE 子句中只看到这些查询的一个区别,因此您可以在那里使用 case 语句。

 SELECT  
     FileID, 
     SUM(CAST(REPLACE(Data,',','.') AS FLOAT)) AS Summed_AAL_Attri
FROM 
    (SELECT 
         *, 
         ROW_NUMBER() OVER (PARTITION BY FileID, "LOB" ORDER BY "Label" ASC) AS rn
     FROM 
         DATA WITH (NOLOCK)  
     WHERE
         Label IN ('AdjAAL', CASE TechPrem
            WHEN 'YES' THEN ''
            WHEN 'NO' THEN 'PureAAL'
            END)
         AND LOB IN ('AOP', 'Boiler', 'TRIA')) AS t
WHERE
    t.rn = 1
    AND FileID = 1
GROUP BY 
    FileID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多