我有一个包含多个列的表,表示操作的出现。
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我提出了什么问题。取消透视以构建唯一日期/值对的列表。
答案 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