我需要从SQL Server存储过程生成报告,其中条件相同但10列的结果不同。
我正在使用CASE语句。每个CASE中还有IF / ELSE块。这个IF / ELSE块从不同的列中提取数据。
我重复相同的CASE声明10次如下:
SELECT
CASE WHEN table1.Field="aa"
THEN
select table2.Field
ELSE
select table3.Field
END as 'FirstColumn',
CASE WHEN table1.Field="aa"
THEN
select table4.Field
ELSE
table5.Field END as 'SecondColumn'
这样我不得不重复10次CASE语句。任何人都可以建议更好的方法吗?
答案 0 :(得分:1)
根据您的示例,所有条款的条件相同:
table1.Field="aa"
如果这个假设是正确的,我建议采用不同的方法来解决这个问题。 创建2个查询,每个查询一个,并使用IF ELSE语法在它们之间切换。
这样的事情:
DECLARE @Var varchar(2)
SELECT @Var = Field
FROM table1 IF @Var = 'aa' BEGIN
SELECT table2.Field AS 'FirstColumn',
table4.Field AS 'SecondColumn'
FROM table2,
table4 END
ELSE BEGIN
SELECT table3.Field AS 'FirstColumn' ,
table5.Field AS 'SecondColumn'
FROM table3,
table5 END
您可以在SQLFiddle找到一个有效的例子。
如果我误解了某些内容并且我会尝试纠正,请告诉我; - )
答案 1 :(得分:0)
这可能更适合作为评论,但它太长了。
你的SQL没有意义。您在when
子句中没有括号的子查询,因此这不是有效的SQL。此外,您在字符串周围有双引号,这意味着"aa"
被解释为列引用,而不是常量。最后,你在列别名周围有单引号,虽然允许,但这是不好的做法。
我也不知道你的意思是“每个CASE中都有IF / ELSE块”,因为在SQL中也不允许这样做。
如果你的意思是:
select (CASE WHEN table1.Field = 'aa' THEN table2.Field
ELSE table3.Field
END) as FirstColumn,
(CASE WHEN table1.Field = 'aa' then table4.Field
ELSE table5.Field
END) as SecondColumn
然后case
语句似乎正确地捕获了你的逻辑。因为table1.field
每行可能不同(而不是整个查询的常量),所以我没有看到“简化”这一点的方法。
然而,我做了一堆假设。您可以使用更好的实际代码示例来修改您的问题。或删除此问题并重新开始,并提供更好的解释。