【问题标题】:Case when in Select, Left Join and Group BySelect, Left Join 和 Group By 中的情况
【发布时间】:2019-08-19 14:38:20
【问题描述】:

如何归档以下内容?

如果@chk = 0,则在结果中包含第 4 列,否则仅保留 3 列, 如果选择了第 4 列,则第 4 列需要左连接, 并将第 4 列包含在 group by 中

DECLARE @chk AS INT= 0;
SELECT a.Ledgerid, 
       b.LedgerCity,
       CASE WHEN @chk = 0 THEN SUM(a.TotalAmount) ELSE SUM(a.NetAmount) END,
       CASE WHEN @chk = 0 THEN c.ledgername END  (is it possilbe to completly do not have this column if @chk <> 0)
FROM ExpenseMaster A
     LEFT JOIN LedgerAddress AS B ON A.LedgerID = B.LedgerID
     LEFT JOIN LedgerMaster AS C ON A.LedgerID = C.LedgerID  --This left join is required only if @chk=0, same logic is there in above select statement
GROUP BY A.LedgerID, 
         B.LedgerCity;
         C.LedgerName; -- this 3rd group required only if @chk=0

一些帖子建议在 Group by 中如何使用案例。我尝试了“当@chk=0 然后a.Ledgerid,b.Ledgercity,c.LedgerName 或者a.Ledgerid,b.Ledgercity END 时按情况分组;但这不起作用

【问题讨论】:

  • AND @Chk = 0 添加到ON 子句中?
  • 只能通过使用 2 个单独的查询和在您的 @chk 变量上的 if ... else 来确定要使用哪个查询来从结果集中遗漏一列。所有其他问题都是完美的,请参阅上面 Larnu 的评论
  • 这个查询可能不是单独运行的。将其留空并允许例程的使用者决定如何处理它有什么问题?

标签: sql sql-server


【解决方案1】:

使用 IF .. ELSE 块

IF @chk = 0 
BEGIN

SELECT a.Ledgerid, 
       b.LedgerCity,
       CASE WHEN @chk = 0 THEN SUM(a.TotalAmount) ELSE SUM(a.NetAmount) END,
       CASE WHEN @chk = 0 THEN c.ledgername END  
FROM ExpenseMaster A
     LEFT JOIN LedgerAddress AS B ON A.LedgerID = B.LedgerID
     LEFT JOIN LedgerMaster AS C ON A.LedgerID = C.LedgerID  --This left join is required only if @chk=0, same logic is there in above select statement
GROUP BY A.LedgerID, B.LedgerCity, C.LedgerName;


END
ELSE
BEGIN

SELECT a.Ledgerid, 
       b.LedgerCity,
       CASE WHEN @chk = 0 THEN SUM(a.TotalAmount) ELSE SUM(a.NetAmount) END    
FROM ExpenseMaster A
LEFT JOIN LedgerAddress AS B ON A.LedgerID = B.LedgerID
GROUP BY A.LedgerID, B.LedgerCity;


END

【讨论】:

  • 我想到了这个选项,但我的生产查询很大。因此,如果我使用“IF ELSE”,则进行更改总是需要在两个地方进行更改。我试图只保留一个版本。我读了一些帖子,其中建议“当 a=b 然后 C 或 d,e,f) 时按情况分组”。但这种方法在我的情况下不起作用。
【解决方案2】:

如果您确定数据库外部没有人可以运行您的查询并执行 sql-injection,只需使用简单的动态 sql 语句

DECLARE @sql AS NVARCHAR(MAX);
DECLARE @chk AS INT= 0;

set @sql = N'SELECT a.Ledgerid, 
               b.LedgerCity, ' +
               CASE WHEN @chk = 0 THEN 'SUM(a.TotalAmount) ' ELSE 'SUM(a.NetAmount) ' END +
               CASE WHEN @chk = 0 THEN ', c.ledgername ' ELSE ' ' END +
        'FROM ExpenseMaster A
             LEFT JOIN LedgerAddress AS B ON A.LedgerID = B.LedgerID ' +
             CASE WHEN @chk=0 THEN 'LEFT JOIN LedgerMaster AS C ON A.LedgerID = C.LedgerID ' ELSE '' END +
        'GROUP BY A.LedgerID, 
                 B.LedgerCity' +
                 CASE WHEN @chk = 0 THEN ', C.LedgerName;' ELSE ';' END;

exec sp_executesql @sql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-11
    • 2021-01-30
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多