0

表名: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

表名: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)

请指教。

4

2 回答 2

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 的工作。数据库只是用于存储和检索数据。不要很好地格式化它。无论如何,您都想使用应用层上的数据。删除重复数据不会使这项工作变得更容易,反而会使情况变得更糟。

于 2013-07-15T15:43:13.260 回答
1

大多数人没有意识到 T-SQL 有一些很酷的排序函数可以与分组一起使用。报告之类的许多事情都可以在 T-SQL 中完成。

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

代码的第二部分创建报告。我使用两个公用表表达式 (CTE)。我本可以再使用两个本地临时表或表变量。这个玩具示例真的没关系。

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

参赛者的姓名和对该参赛者的投票显示在详细信息行上。这是一个典型的报告,小计显示在顶部。

我认为这与您想要的报告输出相匹配。我以多数票降序排列参赛者。

在此处输入图像描述

真挚地

约翰·米纳

www.craftydba.com

--
-- 创建表
--

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

-- 条目表
Create table #tbl_Entry
(
ID int,
CharityName varchar(25),
Title varchar(25),
VoteCount int
);

-- 添加数据 Insert Into #tbl_Entry values
(1, 'save the childrens', 'save them', 1),
(2, 'save the childrens', 'saving childrens', 3),
(3, 'cancer research' , '支持他们', 10)

-- 参赛者表
Create table #tbl_Contestants
(
ID int,
FirstName varchar(25),
LastName varchar(25),
EntryId int
);

-- 添加数据
插入到#tbl_Contestants 值
(1,'Neville','Vyland',1),
(2,'Abhishek','Shukla',1),
(3,'Raghu','Nandan',2) ;

--
-- 创建报告
--

;
与 cte_RankData
作为
(
选择
ROW_NUMBER() OVER (ORDER BY E.CharityName ASC, VoteCount Desc) 作为 RowNum,
RANK() OVER (ORDER BY E.CharityName ASC) AS RankNum,
E.CharityName 作为 CharityName,
C.FirstName + '' + C.LastName 作为 FullName,
E.VoteCount
来自 #tbl_Entry E 内部连接 ​​#tbl_Contestants C on E.ID = C.ID
),


cte_SumData
as
(
select
E.CharityName,
sum(E.VoteCount) as TotalCount
from #tbl_Entry E
group by E.CharityName
)

选择
当 RowNum = RankNum 然后
R.CharityName
else
''
以 rpt_CharityName 结束时的
情况,当 RowNum = RankNum 然后
str(S.TotalCount, 5, 0)
else
''
以 rpt_TotalVotes 结束时的情况,
FullName 作为 rpt_ContestantName,
VoteCount 作为
来自 cte_RankData R 的 rpt_Votes4Contestant
在 R.CharityName = S.CharityName 上加入 cte_SumData S

于 2013-07-15T17:57:10.093 回答