【问题标题】:Best to build a SQL Query or extrapolate with another program?最好构建一个 SQL 查询或用另一个程序推断?
【发布时间】:2011-09-11 01:16:06
【问题描述】:

我在为我们的客户动态开发一些查询时遇到了麻烦,有时我发现自己在问“从我知道我正在寻找的数据子集开始,然后导入到 Excel 等程序中会更好吗?并使用类似的功能(例如“数据透视表”)对数据进行相应处理?

我特别苦恼的一个例子是以下示例:

我有一个在线会员注册系统。为简单起见,我们假设捕获的数据是:会员 ID、注册日期、他们的推荐代码、他们的状态。

一个示例成员表可能如下所示:

MemberID  | Date   | Ref    | USState
=====================================
1         | 2011-01-01  | abc   | AL
2         | 2011-01-02  | bcd   | AR
3         | 2011-01-03  | cde   | CA
4         | 2011-02-01  | abc   | TX

等等……

最终,我想用这个数据集构建和运行的查询类型可以扩展到: “在单个结果集中显示所有推荐代码的列表以及他们每个月的注册数量”。

例如:

Ref   | 2011-01 | 2011-02 | 2011-03 | 2011-04
==============================================
abc   |   1     |   1     |   0     |  0
bcd   |   1     |   0     |   0     |  0
cde   |   1     |   0     |   0     |  0

老实说,我不知道如何在 MySQL 中构建这种类型的查询(我想如果可以做到,它将需要大量代码、连接、子查询和联合。

同样,另一个示例查询可能是每个州每月有多少会员注册

USState  | 2011-01 | 2011-02 | 2011-03 | 2011-04
==============================================
AL  |   1     |   0     |   0     |  0
AR  |   1     |   0     |   0     |  0
CA  |   1     |   0     |   0     |  0
TX  |   0     |   1     |   0     |  0

我想我的问题有两个方面:

1) 实际上,最好尝试使用 MySQL GUI(如 Navicat)中的必要数据构建这些数据,还是将整个数据子集导入 Excel 并继续工作?

2) 如果我要使用 MySQL 路由,在下面提到的示例中构建数据子集的正确方法是什么(请注意,查询可能会变得更加复杂,例如“显示有多少注册进入每个州的每个特定月份,并按每个代理分组(每个代理有 50 个可能的行)"

非常感谢您提前提供的帮助。

【问题讨论】:

    标签: mysql excel join subquery pivot-table


    【解决方案1】:

    我支持在服务器端进行这种查询,至少是为了获取您需要的数据。

    您应该创建一个时间段表。它可以变得随心所欲,甚至可以持续几天。

    id   year    month  monthstart  monthend
    1    2011    1      1/1/2011    1/31/2011
    ...
    

    这使您能够以各种有趣的方式对数据进行分组和查询。

    按您提到的月份查询获取原始推荐计数的数据将非常简单...

    select a.Ref, b.year, b.month, count(*) as referralcount
    from myTable a
    join months b on a.Date between b.monthstart and b.monthend
    group by a.Ref, b.year, b.month
    order by a.Ref, b.year, b.month
    

    结果集将位于像ref = abc, year = 2011, month = 1, referralcount = 1 这样的行中,而不是每个月的列。我假设由于获取更大的数据集并在 Excel 中对其进行操作是一种选择,因此更改这些数据的布局并不困难。

    查看先前的答案,该答案通过不同的示例详细介绍了该概念:SQL query for Figuring counts by month

    【讨论】:

    • 非常感谢您的建议以及其他问题的链接。我什至不知道“之间”功能,所以这有很大帮助。尽管根据您的示例,我遇到的一件事是数据以行而不是多列的形式返回(因此想到可能使用 excel)。作为项目经理,行对我来说很有意义,但 C 级别希望看到每个“引用”行都包含自己的列(一对多关系)
    【解决方案2】:

    我在一个基于 Excel 的应用程序上工作,该应用程序处理多维时间序列数据,并且最近一直致力于实现预定义的数据透视表电子表格,所以我确切地知道您在想什么。我非常支持为用户提供工具,而不是编写单独的报告或完整的查询语言供他们使用。您可以即时创建连接到数据库的数据透视表,这并不难。 Andrew Whitechapel 有一个很好的例子here。但是,您还需要在 Excel 中启动它或设置一个基本的 Excel VSTO 程序,这在 Visual Studio 2010 中很容易做到。(microsoft.com/vsto)

    另一件事,不要觉得您必须创建可笑的复杂查询。您拥有的每个连接都会减慢任何关系数据库的速度。多年前我发现,在大多数情况下对临时表执行多步查询会更清晰、更快,并且更容易编写和支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多