【问题标题】:SQL Server - Matrix of multiple WHERE queriesSQL Server - 多个 WHERE 查询的矩阵
【发布时间】:2018-05-16 23:00:28
【问题描述】:

如果我有如下表:

Source  Event           Date        Qty
Site A  Create Account  5/05/2018   6
Site B  Create Account  4/05/2018   12
Site A  Update Account  6/05/2018   1
Site A  Update Notes    7/05/2018   2
Site B  Add Dependant   5/05/2018   1
Site C  Create Account  5/05/2018   14

还有一个这样的:

Date        OrdersRec
4/05/2018   162
5/05/2018   123
6/05/2018   45
7/05/2018   143

并希望构建一种矩阵表,以便能够一次又一次地用于各种日期范围的查询,如下所示:

Date        Create  Update  UpdateNotes AddDependant    OrdersRec
4/05/2018   12      0       0           0               162
5/05/2018   20      0       0           1               123
6/05/2018   0       1       0           0               45
7/05/2018   0       0       2           0               143

最好的方法是什么?

我从日期和 CreateAccount 数字的 INSERT 开始,但我不确定如何返回并更新特定日期的其他计数,或者即使那很愚蠢而且我遗漏了一些明显的东西。

谢谢!

【问题讨论】:

    标签: sql sql-server merge


    【解决方案1】:

    只需使用union alljoin。没有理由为此创建一个新表:

    select date, sum(v_create) as v_create, sum(v_update) as v_update,
           sum(v_updatenotes) as v_updatenotes, sum(v_adddependent) as v_adddependent,
           sum(orderrec) as orderec
    from ((select t1.date, v.*, 0 as OrdersRec
           from table1 t1 cross apply
                (values ( (case when event = 'Create Account' then quantity else 0 end),
                          (case when event = 'Update Account' then quantity else 0 end),
                          (case when event = 'Update Notes' then quantity else 0 end),
                          (case when event = 'Add Dependent' then quantity else 0 end)
                        )
                 ) v(v_create, v_update, v_updatenotes, v_adddependent)
          ) union all
          (select date, 0, 0, 0, 0, orderrec
           from table2
          )
         ) t
    group by date
    order by date;
    

    这可以处理很多边缘情况,例如当一个或另一个表中缺少日期时。

    【讨论】:

    • 虚幻。感谢戈登的帮助。自从我在 SQL 中完成任何真正的报告工作以来已经有一段时间了,显然有点生疏了。像魅力一样工作。
    【解决方案2】:

    为什么不创建一个包含所有日期的变量表,并将其用作主表。

    那么你会是这样的

    select m.date,
    sum(case when event = 'Create Account' then 1 else 0) as create,
    sum(case when event = 'Update Account' then 1 else 0) as updates,
    sum(o.ordersrec) as orders
    from @main as m
           inner join @orders as o on o.date = m.date
           inner join @events as e on e.date = m.date
    group by m.date
    

    【讨论】:

    • 谢谢梅斯!现在也试试你的。感谢您的快速帮助!
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多