SQL组由多列组成

时间:2013-07-15 14:23:58

标签: sql sql-server-2008-r2 group-by

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

请建议。

2 个答案:

答案 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,我们就是慈善机构的第一个实例。打印慈善机构名称和总投票数。否则,打印出空白。

参赛者的名字和参赛者的投票在详细线上显示。这是一个典型的报告,其子总数显示在顶部。

我认为这与您想要的报告输出相匹配。我通过大多数选票下降来命令参赛者。

enter image description here

此致

John Miner

www.craftydba.com

-
- 创建表格 -

- 取下桌子
删除表#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