2013-07-15 111 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