表名:EntryTable
ID CharityName Title VoteCount
1 save the childrens save them 1
2 save the childrens saving childrens 3
3 cancer research support them 10
Tablename: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 :(得分: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的工作。数据库就在那里存储和检索数据。不要很好地格式化它。您希望无论如何都要使用应用程序层上的数据。删除重复数据不会使这项工作变得更容易,这会使情况变得更糟。
答案 1 :(得分:1)
大多数人都没有意识到T-SQL有一些很酷的排名功能可以用于分组。报告等许多内容都可以在T-SQL中完成。
下面代码的第一部分创建了两个本地临时表,并使用数据加载它们以进行测试。
代码的第二部分创建报告。我使用两个公用表表达式(CTE)。我本可以使用另外两个本地临时表或表变量。这个玩具的例子真的没关系。
cte_RankData有两列RowNum和RankNum。如果RowNum = RankNum,我们就是慈善机构的第一个实例。打印慈善机构名称和总投票数。否则,打印出空白。
参赛者的名字和参赛者的投票在详细线上显示。这是一个典型的报告,其子总数显示在顶部。
我认为这与您想要的报告输出相匹配。我通过大多数选票下降来命令参赛者。
此致
John Miner
-
- 创建表格
-
- 取下桌子
删除表#tbl_Entry;
删除表#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,
FirstName varchar(25),
LastName varchar(25),
EntryId int
);
- 添加数据
插入#tbl_Contestants值
(1,'内维尔','维兰',1),
(2,'Abhishek','Shukla',1),
(3,'Raghu','Nandan',2);
-
- 创建报告
-
;
用cte_RankData
作为
(
选择
ROW_NUMBER()OVER(由E.CharityName ASC,VoteCount Desc订购)为RowNum,
RANK()OVER(由E.CharityName ASC订购)作为RankNum,
E.CharityName作为CharityName,
C.FirstName +''+ C.LastName as FullName,
E.VoteCount
来自#tbl_Entry E内连接#tbl_Contestants C on E.ID = C.ID
),
cte_SumData
作为
(
选择
E.CharityName,
sum(E.VoteCount)为TotalCount
来自#tbl_Entry E
由E.CharityName组成的团体
)
选择
RowNum = RankNum然后
的情况
R.CharityName
否则
''
结束为rpt_CharityName,
RowNum = RankNum然后
的情况
str(S.TotalCount,5,0)
否则
''
结束为rpt_TotalVotes,
FullName为rpt_ContestantName,
VoteCount为rpt_Votes4Contestant
来自cte_RankData R join cte_SumData S
在R.CharityName = S.CharityName