0

我有一个包含多个列的表,这些列代表一个动作的出现。

简单表示例

id  type $$$$$ value1 value2 value3 ... value15
--  ----  --   -----  -----  -----      -----
1    "I"   1    "a"    "b"    ""         ""
2    "O"   1    "a"    "d"    "f"        "z"
3    "I"   1    "d"    "b"    ""         ""
4    "O"   1    "g"    "l"    ""         ""
5    "I"   1    "z"    "g"    "a"         ""
6    "I"   1    "z"    "g"    "a"         "a"

不太确定如何表示数据,但上面应该显示它......每行,我有多个要分组的列。专注于“a”部分,我希望输出如下:

Type     Value    Count  Sum
-----    -----    -----  ---
"I"      "A"      "3"     3
"O"      "A"      "2"     1

只是不知道如何去,甚至是最好的方式,用多列分组。如果它是一个带有序列号的“高”表,那将是一个快照......

我担心的一件事是......如果我在多行中具有相同的值(它们多次执行相同的操作),我堆叠列并尝试对行求和。因此,例如第 6 行有 3 和 15 的值为 a,我尝试 Sum() 该组的总数,我不希望 6 计算两次(如上所示

编辑: 试图在这里澄清......我有一排有“行动”的客户。动作被折叠成 value1 到 value15。我想计算“类型,值”组的数量。

我之前的计数是错误的......我想要有特定操作的不同客户,而不是特定操作的数量。所以IA应该是4,使用上面的可见表。

我想出的最终注释代码审查问题。Unpivot 以构建唯一日期/值对的列表。

4

2 回答 2

2

假设 SQL 2005 或更高版本,您可以使用UNPIVOT,然后执行 GROUP BYs 和 COUNTs

于 2011-01-31T18:10:36.150 回答
1

您是否可以选择将该表置于第一范式并将这些重复列分解为子表?因为,如果我们抛开 1NF 为什么好的理论,实际情况是,像这样的非标准化示例会使简单的查询变得困难。

话虽如此,如果你被这个非规范化的表所困扰,你必须编写如下代码:

select type
     , 'A' as Column2
     , sum(case when value1='A' or value2='A' or.....
               then 1 else 0 end) as theCount
  from theTable
 group by type

如果要查询多个值,而不仅仅是“A”,则必须在查询中对表进行透视,这涉及哦大约 15 个联合:

select type,value,count(*) from (
    select type,value1 as value from theTable
    union all
    select type,value2 as value from theTable
    union all
    select type,value3 as value from theTable
    ...and so on...
) x
group by type,value
于 2011-01-31T18:09:45.143 回答