TSQL问题:按多列分组

时间:2011-01-31 18:01:08

标签: tsql group-by multiple-columns

我有一个包含多个列的表,表示操作的出现。

simpleTableExample

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。我想得到一个“类型,价值”组的数量。

我之前的计数错了......我希望有特定行动的独特客户,而不是某些行动的数量。所以I-A应该是4,使用上面的可见表。

最终注释 Code Review我提出了什么问题。取消透视以构建唯一日期/值对的列表。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您是否可以选择将该表放在First Normal Form中并将这些重复列拆分为子表?因为,如果我们抛开为什么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