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 で実行できます。

以下のコードの最初の部分では、2 つのローカル一時テーブルを作成し、テスト用のデータをロードします。

コードの 2 番目の部分は、レポートを作成します。2 つの共通テーブル式 (CTE) を使用します。さらに 2 つのローカル一時テーブルまたはテーブル変数を使用することもできました。このおもちゃの例では問題ありません。

cte_RankData には、RowNum と RankNum の 2 つの列があります。RowNum = RankNum の場合、charity の最初のインスタンスにいます。慈善団体名と総投票数を出力します。それ以外の場合は、空白を印刷します。

出場者の名前とその出場者への投票が詳細行に表示されます。これは、上部に小計が表示される典型的なレポートです。

これは、ご希望のレポート出力と一致すると思います。投票数の多い順に出場者を並べました。

ここに画像の説明を入力

心から

ジョン・マイナー

www.craftydba.com

--
-- テーブルを作成します
--

-- テーブルを削除し
ます drop table #tbl_Entry;
テーブル #tbl_Contestants をドロップします。

-- エントリ テーブル
Create table #tbl_Entry
(
ID int,
CharityName varchar(25),
Title varchar(25),
VoteCount int
);

-- #tbl_Entry 値にデータを挿入します
(1, 'save the children', 'save them', 1),
(2, 'save the children', 'saving children', 3),
(3, 'cancer research' 、「彼らをサポートする」、10)

-- 出場者テーブル
テーブル #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) ;

--
-- レポートを作成する
--

;
with cte_RankData
as
(
select ROW_NUMBER
() OVER (ORDER BY E.CharityName ASC, VoteCount Desc) as RowNum,
RANK() OVER (ORDER BY E.CharityName ASC) AS RankNum,
E.CharityName as CharityName,
C.FirstName + ' ' + C.LastName as FullName,
E.VoteCount
from #tbl_Entry E 内部結合 #tbl_Contestants C on E.ID = C.ID
),


cte_SumData
as
(
E.CharityName

sum(E.VoteCount) を E.CharityName
による #tbl_Entry E
グループから TotalCount として選択
)

select
case when RowNum = RankNum then
R.CharityName
else
''
end as rpt_CharityName,
case when RowNum = RankNum then
str(S.TotalCount, 5, 0)
else
''
end as rpt_TotalVotes,
FullName as rpt_ContestantName,
VoteCount as rpt_Votes4Contestant
from cte_RankData R
R.CharityName = S.CharityName でcte_SumData Sに参加

于 2013-07-15T17:57:10.093 に答える