2016-04-05 12 views
0

私はこれが簡単な答えでダムの質問であると感じましたが、ここに行きます。DISTINCTを使用せずに、値を変更せずにデータをグループ化する方法は?

DISTINCTを使用せずに次のデータをグループ化するにはどうすればよいですか? @Tableには5行があり、これは5-9時間のデータを示します。私はちょうどDISTINCTが好きではありません。

Hr9(0-4を含む)までのすべての時間を表示する必要があるため、テーブルDimTimeに参加しています。 DimTimeにはすべての時間がありますが、15分間隔です。だから、DimTimeは次のようになります。私は、GROUP BYを使用し、その後、私は、集計関数を持っている必要がある場合は

declare @table table 
(
    Hour int, 
    Value int 
) 

insert into @table select 5, 25 
insert into @table select 6, 34 
insert into @table select 7, 54 
insert into @table select 8, 65 
insert into @table select 9, 11 

select d.hour, t.hour, sum(value) 
from @table t 
left join dimtime d on d.hour = t.hour 
group by d.hour, t.hour 

Hour Minute 
0  0 
0  15 
0  30 
0  45 
1  0 
1  15 
1  30 
1  45 

だからここに私のスクリプトです。したがって、私がSUMを使用すると、すべての値に4を掛けます。集計関数を削除すると、構文エラーが発生します。

@tableの内容はCTEであるため、CTEを使用することはできません(ここには含まれていません)。

はここで私は表示に必要な結果だ:

Hour Value 
0  null 
1  null 
2  null 
3  null 
4  null 
5  25 
6  34 
7  54 
8  65 
9  11 
+0

は私たちにサンプルデータと欲望の結果を表示します。今はあなたが手に入れようとしていることがはっきりしない。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を向上させ、より良い回答を得る方法を学ぶことができます。 –

+0

サンプルデータとtsqlスクリプトが含まれています。唯一欠けているのは返される正確なデータですが、質問のテキストから推測できると仮定しました。 – rbhat

+0

あなたは間違っていると思っていますが、私はあなたが望む結果が何であるかはわかりません。また、何を意味するのかわからない '私はHr9(0-4を含む)までのすべての時間を表示する必要がある' –

答えて

-1

私はGROUP BYを使用する場合、私はあなたがあなたのSELECTで表現が含まれている場合のみ集約関数

を持っている必要がありますグループキーの一部ではありません。あなたは確かに最初のクエリはあなたDISTINCTとまったく同じ結果が得られます(さらに同じクエリプランにコンパイルすることができる)ことを

select d.hour, t.hour, value 
from @table t 
inner join dimtime d 
    on d.hour = t.hour 
group by d.hour, t.hour, value 

または

select d.hour, t.hour, MIN(value) 
from @table t 
inner join dimtime d 
    on d.hour = t.hour 
group by d.hour, t.hour 

注意を行うことができますので、私はよく分かりませんあなたの嫌悪感はDISTINCTになります。

+0

何年も前にtsqlを使い始めたとき重複を排除するために非常に大きな結果にDISTINCTを使用したことを覚えています。そして、私はDBがグループ化するのではなく、そのキーワードを使って大ヒットしたことを覚えています。だから私はちょうど私と一緒に宿泊したと思う。 – rbhat

+0

しかしあなたは正しいので、DISTINCTの使用を避けるべき理由はありません。 – rbhat

1

条件を追加するだけで、1時間に1つの行が返されます。WHERE minute = 0

1

dimtimeの並べ替え操作をスキップしてdistinct節を使用する場合は、以下の説明を確認してください。

dimtimeから

すべて表示時間(0-9)と、特定の時間@tableで与えられたvalueを合計:

あなたはすべてのためのあなたの dimtableに値 minute = 0と行を持っていると仮定すると
SELECT 
    d.hour, SUM(t.value) 
FROM 
    dimtime d 
    LEFT JOIN @table t 
    ON d.hour = t.hour 
WHERE d.minute = 0 -- retrieves one row for every hour from dimtime 
GROUP BY d.hour 
ORDER BY d.hour -- not needed, but will give you resultset sorted by hour 

あなたは結合操作のために検索された行を制限することができます。それはリスト0, 15, 30, 45からの任意の値で動作します。

SUM()は、hourのすべての値を合計して、@tableに正しく機能します。特定の時間の行がない場合は、0の値を返します。

0
  1. あなたは
  2. 「私はちょうどそれを好きではない」よりも、プログラミング機能を使用していないため、より良い理由を持っている必要がありますが提供@dnoeth別のCTE

を使用するCTEを持つことができます優れた答えが、ここでは別のオプションがあります:

SELECT 
    d.hour, 
    t.value 
FROM 
    @table t 
INNER JOIN (SELECT DISTINCT hour FROM dimTime) d ON d.hour = t.hour 
0

SELECT * 
FROM DimTime D 
LEFT JOIN myTable T 
     ON D.Hour = T.Hour 
WHERE D.Minute = 0 
をお試しください

​​

出力

| Hour | Minute | Hour | Value | 
|------|--------|--------|--------| 
| 0 |  0 | (null) | (null) | 
| 1 |  0 | (null) | (null) | 
| 2 |  0 | (null) | (null) | 
| 3 |  0 | (null) | (null) | 
| 4 |  0 | (null) | (null) | 
| 5 |  0 |  5 |  25 | 
| 6 |  0 |  6 |  34 | 
| 7 |  0 |  7 |  54 | 
| 8 |  0 |  8 |  65 | 
| 9 |  0 |  9 |  11 | 
関連する問題