SQL中按行和列计算的网格

时间:2018-05-15 15:03:40

标签: sql sql-server crosstab

我真的很难创建一个简单的网格,我可以提供给非技术团队成员,这样他们就可以根据任何两个人口统计特征轻松查找SQL客户数据库中的人数。

例如,我们经常会遇到类似以下问题:数据库中有多少人是36-45岁的男性和#34;或者"我们的数据库中有多少18-25岁的人可以通过电子邮件发送#34;使用查找网格,他们将能够自己回答这些问题。

实际数据有很多变量,因此实际网格可能很大,但源数据表的简化示例每个客户有1行(约3米行),并带有以下列:

party_id        -- Customer ID #
, gender        -- 'Male'/'Female'/'Unknown gender'
, age           -- '18-25'/'26-35'/'36-45'/'46-55'/'56-65'/'66-80'/'Unknown age'
, emailability  -- 'Emailable'/'Not Emailable'

结果网格将具有相同的行和列,每个单元格中的客户数量(即满足行和列标准的人数)。在此示例中,行和列将为:

Male
Female
Unknown gender
18-25
26-35
36-45
46-55
56-65
66-80
Unknown age
Emailable
Not emailable

要查找满足任何两个条件的人数,您只需要找到网格上的交集(在上面的第一个问题中,这是行的交集:"男性"和专栏:" 18-25"或行:" 18-25"和专栏:"男")。

这听起来不应该是一个困难的问题,但我完全难倒了。我认为这将由Pivots解决,但我无法找到一种方法来交叉制表超过2个变量。 SQL可能不是这项工作的正确工具,但目前我没有其他工具可用,所以如果可能的话我想找到一个SQL解决方案,但如果你知道更好的选择,请告诉我

我很惊讶没有在这里找到现有的解决方案,但我可能没有使用正确的搜索词,所以如果已经得到答案就道歉。

谢谢!

- EDIT-- 根据要求提供了一些示例数据:

party_id |gender |age     |Emailability  |
---------|-------|--------|--------------|
1        |Male   |18-25   |Not Emailable |
2        |Female |Unknown |Emailable     |
3        |Unknown|36-45   |Emailable     |
4        |Male   |36-45   |Not Emailable |
5        |Male   |56-65   |Emailable     |
6        |Female |26-35   |Emailable     |
7        |Male   |18-25   |Emailable     |
8        |Unknown|18-25   |Not Emailable |
9        |Male   |66-80   |Emailable     |
10       |Female |26-35   |Emailable     |

根据这个示例数据,填充的网格的前几行看起来像这样(由于页面宽度,我不得不删除可邮寄性列,但它们也会包括在内):

                   Male Female Unknown Gender 18-25 26-35 36-45 46-55 56-65 66-80
    Male           5    0      0              2     0     1     0     1     1     
    Female         0    3      0              0     2     0     0     0     0       
    Unknown gender 0    0      2              1     0     1     0     0     0     
    18-25
    26-35
    36-45
    46-55
    56-65
    66-80
    Unknown age
    Emailable
    Not emailable

为了澄清我认为它引起了一些混乱,我并没有尝试为其他数据库用户创建一个视图 - 我希望创建一个输出,我可以导出为非技术人员excel用作讲义/备忘单。可能是这个网格不能单独使用SQL来按计划设置,但是由于数据集的大小和有限数量的工具,我希望它可以在SQL中完成。再次感谢您的任何建议。

0 个答案:

没有答案