C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

SQLServerでのデータ取得方法について /ルパン (19/01/08(Tue) 15:28) #89852
Re[1]: SQLServerでのデータ取得方法について /kiku (19/01/08(Tue) 16:07) #89853
│└ Re[2]: SQLServerでのデータ取得方法について /ルパン (19/01/09(Wed) 10:10) #89857
│  └ Re[3]: SQLServerでのデータ取得方法について /Hongliang (19/01/09(Wed) 10:29) #89858
Re[1]: SQLServerでのデータ取得方法について /魔界の仮面弁士 (19/01/09(Wed) 11:13) #89859
  └ Re[2]: SQLServerでのデータ取得方法について /kiku (19/01/09(Wed) 13:50) #89861
    └ Re[3]: SQLServerでのデータ取得方法について /ルパン (19/01/09(Wed) 14:56) #89862
      └ Re[4]: SQLServerでのデータ取得方法について /ルパン (19/01/16(Wed) 10:24) #89910 解決済み


親記事 / ▼[ 89853 ] ▼[ 89859 ]
■89852 / 親階層)  SQLServerでのデータ取得方法について
□投稿者/ ルパン (9回)-(2019/01/08(Tue) 15:28:06)

分類:[.NET 全般] 

2019/01/08(Tue) 15:28:43 編集(投稿者)
SQLServer で処理を行っています。
以下のようなデータ(左側)が順不同で登録されている場合
3列目には1列目で区分される最大個数をいれて取得したいのですが
どうすればよいのでしょうか

A,1→A,1,3
A,2→A,2,3
A,3→A,3,3
B,1→B,1,2
B,2→B,2,2
C,1→C,1,4
C,2→C,2,4
C,3→C,3,4
C,4→C,4,4

[ □ Tree ] 返信 編集キー/

▲[ 89852 ] / ▼[ 89857 ]
■89853 / 1階層)  Re[1]: SQLServerでのデータ取得方法について
□投稿者/ kiku (69回)-(2019/01/08(Tue) 16:07:56)
こんな感じ。

SELECT T1.[col1]
      ,T1.[col2]
	  ,
	  (
		select count(T2.col1) from [test].[dbo].[table1] as T2 where T2.col1 = T1.col1
	  ) as col3
  FROM [test].[dbo].[table1] as T1



[ 親 89852 / □ Tree ] 返信 編集キー/

▲[ 89853 ] / ▼[ 89858 ]
■89857 / 2階層)  Re[2]: SQLServerでのデータ取得方法について
□投稿者/ ルパン (10回)-(2019/01/09(Wed) 10:10:10)
すみません。そうですよね。

=T1=
A,1
A,2
:
C,4

を求めるのに長いSQL(※1)を書いたので
以下のようにめっちゃ長いSQL(と言っても80行ほどですが)に
するのがいやで何か方法がないかと思って質問しました。

SELECT col1, col2,
    (
     select count(T2.col1)
     from ※1 as T2
     where T2.col1 = T1.col1
    ) as col3
FROM  (
    長文SQL(※1)
    ) as T1

最終的にはやはり同じものを2か所に書くのはいやなので
以下のように一時ファイルを作成して処理させようと思いますが、
みなさんならどうされますか?

SELECT *
INTO  #T1
FROM  (
    ※1
    );

SELECT col1, col2,
    (
     select count(T2.col1)
     from #T1 as T2
     where T2.col1 = T1.col1
    ) as col3
FROM  #T1



[ 親 89852 / □ Tree ] 返信 編集キー/

▲[ 89857 ] / 返信無し
■89858 / 3階層)  Re[3]: SQLServerでのデータ取得方法について
□投稿者/ Hongliang (739回)-(2019/01/09(Wed) 10:29:09)
WITH temp AS (※1)
SELECT col1, col2,
    (
     select count(T2.col1)
     from temp as T2
     where T2.col1 = T1.col1
    ) as col3
FROM  temp as T1

でいいんじゃないですかね

[ 親 89852 / □ Tree ] 返信 編集キー/

▲[ 89852 ] / ▼[ 89861 ]
■89859 / 1階層)  Re[1]: SQLServerでのデータ取得方法について
□投稿者/ 魔界の仮面弁士 (2008回)-(2019/01/09(Wed) 11:13:33)
No89852 (ルパン さん) に返信
> 以下のようなデータ(左側)が順不同で登録されている場合
> 3列目には1列目で区分される最大個数をいれて取得したいのですが
> どうすればよいのでしょうか

自分も Hongliang さん同様、WITH 句を使う派なのですが、
今回のケースで言うと、窓関数で処理した方が手っ取り早いかも。


SELECT
  col1
, col2
, col3 = MAX(col2) OVER (PARTITION BY col1)
, col4 = COUNT(ALL col1) OVER (PARTITION BY col1)
FROM
  Table1  -- ※1

[ 親 89852 / □ Tree ] 返信 編集キー/

▲[ 89859 ] / ▼[ 89862 ]
■89861 / 2階層)  Re[2]: SQLServerでのデータ取得方法について
□投稿者/ kiku (70回)-(2019/01/09(Wed) 13:50:55)
> SELECT
> col1
> , col2
> , col3 = MAX(col2) OVER (PARTITION BY col1)
> , col4 = COUNT(ALL col1) OVER (PARTITION BY col1)
> FROM
> Table1 -- ※1

OVER句が存在するのを初めて知りました。
ありがとうございます。

[ 親 89852 / □ Tree ] 返信 編集キー/

▲[ 89861 ] / ▼[ 89910 ]
■89862 / 3階層)  Re[3]: SQLServerでのデータ取得方法について
□投稿者/ ルパン (11回)-(2019/01/09(Wed) 14:56:08)
2019/01/09(Wed) 15:43:06 編集(投稿者)
2019/01/09(Wed) 15:09:38 編集(投稿者)
2019/01/09(Wed) 15:09:22 編集(投稿者)
<pre><pre>2019/01/09(Wed) 14:58:21 編集(投稿者)

ありがとうございました。

WITH, OVER どちらも試してみて
処理の早い方を使用します。

あと、一時ファイルを使用するのは一番遅いかも
しれないですね。
DataSetで一時ファイルなら以下の場合取り出すことができるけど
WITH だとできないみたいですね。

WITH T1 AS (※1)
, T2 AS (※2)

SELECT *
FROM  T1

SELECT * ← エラーが発生する
FROM  T1
LEFT  OUTER JOIN T2
     ON T2.CODE = T1.CODE
----------------------------------------
SELECT * INTO #T1 FROM (※1);
SELECT * INTO #T2 FROM (※2);

SELECT *
FROM  T1

SELECT *
FROM  #T1
LEFT  OUTER JOIN #T2
     ON #T2.CODE = #T1.CODE

</pre></pre>
[ 親 89852 / □ Tree ] 返信 編集キー/

▲[ 89862 ] / 返信無し
■89910 / 4階層)  Re[4]: SQLServerでのデータ取得方法について
□投稿者/ ルパン (14回)-(2019/01/16(Wed) 10:24:53)
No89862 (ルパン さん) に返信
> 2019/01/09(Wed) 15:43:06 編集(投稿者)
> 2019/01/09(Wed) 15:09:38 編集(投稿者)
> 2019/01/09(Wed) 15:09:22 編集(投稿者)
> <pre><pre>2019/01/09(Wed) 14:58:21 編集(投稿者)
>
> ありがとうございました。
>
> WITH, OVER どちらも試してみて
> 処理の早い方を使用します。
>
> あと、一時ファイルを使用するのは一番遅いかも
> しれないですね。
> DataSetで一時ファイルなら以下の場合取り出すことができるけど
> WITH だとできないみたいですね。
>
> WITH T1 AS (※1)
> , T2 AS (※2)
>
> SELECT *
> FROM  T1
>
> SELECT * ← エラーが発生する
> FROM  T1
> LEFT  OUTER JOIN T2
>      ON T2.CODE = T1.CODE
> ----------------------------------------
> SELECT * INTO #T1 FROM (※1);
> SELECT * INTO #T2 FROM (※2);
>
> SELECT *
> FROM  T1
>
> SELECT *
> FROM  #T1
> LEFT  OUTER JOIN #T2
>      ON #T2.CODE = #T1.CODE
>
> </pre></pre>
解決済み
[ 親 89852 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -