【问题标题】:Select Case FROM Union从联合中选择案例
【发布时间】:2017-10-13 10:47:40
【问题描述】:

为了报告和创建报告(MS SQL SERVER 2014),它将比较最后一天、上周同一天和上个月同一天的交易数量和金额,我需要一些像这样的查询,但它不起作用:

Select 
   Acquirer = case when Date = @Day then a.Acquirer
                   when Date = @LastWeekDay then b.Acquirer
                   when Date = @LastMonthDay then c.Acquirer
              end
,  RC =       case when Date = @Day then a.RC
                   when Date = @LastWeekDay then b.RC
                   when Date = @LastMonthDay then c.RC
              end
, Desc =      case when Date = @Day then a.Desc
                   when Date = @LastWeekDay then b.Desc
                   when Date = @LastMonthDay then c.Desc
              end
, Day_Tr_Count =  case when Date = @Day then a.Count end
, LWD_Tr_Count =  case when Date = @LastWeekDay then b.Count end
, LMD_Tr_Count =  case when Date = @LastMonthDay then c.Count end
, Day_Tr_Amount =  case when Date = @Day then a.Amount end
, LWD_Tr_Amount =  case when Date = @LastWeekDay then b.Amount end
, LMD_Tr_Amount =  case when Date = @LastMonthDay then c.Amount end

from
  ( select * from T1
     union
    select * from T2
     union
    select * from T3) x
group by Acquirer,RC,Desc

所有 3 个表的结构都非常相似:

T1,T2,T3(acquirer,RC,Desc,Count,Amount,Date).

报告应该是:

result_table(Acquirer,RC,Desc,Daily_Count,Last_Week_Day_Count,Last_Month_Count,Daily_Amount,Last_Week_Day_Amount,Last_Month_Day_Amount)

【问题讨论】:

  • 第 1 步:您可能想要UNION ALL
  • 如何不工作
  • 一般 GROUP BY 规则说:“如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或作为集合函数的参数。”
  • 因为他在查询别名中没有a、b、c表
  • 我不明白为什么人们会写出带有这么多基本错误的庞大查询...他们应该一步一步地这样做,以防他们不知道自己在做什么。

标签: sql sql-server select case union


【解决方案1】:

嗯。您有一个没有group by 的聚合查询。也许:

Select v.Acquirer, v.RC, v.Desc,
       Day_Tr_Count =  sum(case when Date = @Day then a.Count end),
       LWD_Tr_Count =  sum(case when Date = @LastWeekDay then b.Count end),
       LMD_Tr_Count =  sum(case when Date = @LastMonthDay then c.Count end),
       Day_Tr_Amount =  sum(case when Date = @Day then a.Amount end
       LWD_Tr_Amount =  sum(case when Date = @LastWeekDay then b.Amount end),
       LMD_Tr_Amount =  sum(case when Date = @LastMonthDay then c.Amount end)

from (select * from T1
      union all
      select * from T2
      union all
      select * from T3
     ) x cross apply
     (values (case when Date = @Day then a.Acquirer
                   when Date = @LastWeekDay then b.Acquirer
                   when Date = @LastMonthDay then c.Acquirer
              end,
              case when Date = @Day then a.RC
                   when Date = @LastWeekDay then b.RC
                   when Date = @LastMonthDay then c.RC
              end,
              case when Date = @Day then a.Desc
                   when Date = @LastWeekDay then b.Desc
                   when Date = @LastMonthDay then c.Desc
              end
             ) v (Acquirer, RC, Desc)
group by v.Acquirer, v.RC, v.Desc;

注意:desc 是列(或其他任何内容)的错误名称。它是一个 SQL 关键字(想想order by)。

【讨论】:

    猜你喜欢
    • 2018-12-14
    • 2015-02-02
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    相关资源
    最近更新 更多