2013-07-15 62 views
0

表名:EntryTableSQL GROUPBY多列

ID   CharityName   Title    VoteCount 
1    save the childrens  save them   1 
2    save the childrens  saving childrens  3 
3    cancer research  support them  10 

表名:ContestantTable

ID    FirstName    LastName   EntryId 
1    Neville    Vyland    1 
2    Abhishek    Shukla    1 
3    Raghu     Nandan    2 

所需的输出

CharityName   FullName     
save the childrens  Neville Vyland 
         Abhishek Shukla    
cancer research  Raghu Nandan     

我试图

select LOWER(ET.CharityName) AS CharityName,COUNT(CT.FirstName) AS Total_No_Of_Contestant 
    from EntryTable ET 
    join ContestantTable CT 
    on ET.ID = CT.ID 
    group by LOWER(ET.CharityName) 

请指教。

+0

可以在安装了一个[SQL小提琴](http://sqlfiddle.com/)这一点。 –

+0

您不应该按ET.CharityName进行分组,因为这样您将无法获取与其关联的人员的姓名。 –

+0

据我所知,你所需的输出不能用SQL来实现。这就是报告生效的原因。 –

回答

1

请看看sqlfiddle

与此查询一试:

SELECT 
e.CharityName, 
c.FirstName, 
c.LastName, 
sq.my_count 
FROM 
EntryTable e 
INNER JOIN ContestantTable c ON e.ID = c.EntryId 
INNER JOIN (
    SELECT EntryId, COUNT(*) AS my_count FROM ContestantTable GROUP BY EntryId 
) sq ON e.ID = sq.EntryId 

我以为你其实也很想ContestantTable的ENTRYID列加入。这对我来说更有意义。无论哪种方式(加入我的方式或你的方式)你的样品数据是错误的。

除此之外,你不想重复CharityNames。这不是SQL的工作。数据库就在那里存储和检索数据。不要很好地格式化它。无论如何,您都希望处理应用程序层上的数据。删除重复的数据不会使这项工作更容易,这使情况变得更糟。

+0

完美...这就是我一直在寻找... –

1

大多数人没有意识到T-SQL有一些很酷的排名功能可以用于分组。许多报表都可以在T-SQL中完成。

下面的代码的第一部分创建两个本地临时表,并将它们加载数据以进行测试。

代码的第二部分创建报告。我使用两个通用表格表达式(CTE)。我可以使用另外两个本地临时表或表变量。这个玩具的例子真的不重要。

cte_RankData有两列RowNum和RankNum。如果RowNum = RankNum,我们就是第一个慈善机构。打印慈善机构名称和总票数。否则,打印出空白。

参赛者的姓名和参赛者的选票都显示在细节上。这是一个典型的报告,小计显示在最上面。

我认为这符合您想要的报告输出。我以大多数选票下降的方式命令参赛者。

enter image description here

真诚

约翰·迈纳

www.craftydba.com

-
- 创建表
-

- 删除表
删除表#tbl_Entry;
drop table #tbl_Contestants;

- 中的条目表
创建表#tbl_Entry

ID INT,
CharityName VARCHAR(25),
标题VARCHAR(25),
VoteCount INT
);

- 添加数据 插入进#tbl_Entry值
(1, '拯救儿童', '保存',1),
(2, '拯救儿童', '儿童储蓄', 3),
(3, '癌症研究', '支持他们',10)

- 参赛者表
创建表#tbl_Contestants

ID INT,
名字varchar(25),
LastName varchar(25),
EntryId int
);

- 添加数据
插入进#tbl_Contestants值
(1, '尼维尔', 'Vyland',1),
(2, '阿布舍克', '舒克拉',1),
(3,'Raghu','南丹',2);

-
- 创建报表
-

;
与cte_RankData


选择
ROW_NUMBER()OVER(ORDER BY E.CharityName ASC,VoteCount说明)作为ROWNUM,
RANK()OVER(ORDER BY E.CharityName ASC)AS RankNum,
E.CharityName如CharityName,
C.FirstName + '' + C.LastName如全名,
E.VoteCount
从#tbl_Entry E对E.ID = C.内部联接#tbl_ContestantsçID
),


cte_SumData
作为
从#tbl_EntryË
组(
选择
E.CharityName,
总和(E.VoteCount)作为TOTALCOUNT
由E. CharityName

选择
情况下,当ROWNUM = RankNum然后
R.CharityName
别的
''
端作为rpt_CharityName,
情况下,当ROWNUM = RankNum然后
STR(S.TotalCount,5,0)
否则
'
末 作为rpt_TotalVotes,
全名作为rpt_ContestantName,
VoteCount为rpt_Votes4Contestant
从cte_RankData R连接cte_SumData小号
上R.CharityName = S.CharityName