0

最初に: ここでは完全な SQL 初心者です。残念ながら、私は締め切りにこの衝動に駆られました。:/ これがばかげた質問である場合は、申し訳ありません。

だから私は、さまざまな列を持つビューを持つ DB を持っています。私が興味を持っている 2 つの列があります: UserIDAgeです。

  • Ageには、レポートの作成日からの経過日数が保存されます。
  • UserIDは、レポートを作成したユーザーです。

ビューには、ユーザーのすべてのレポートが一覧表示されます。

私がしなければならないことは、既存のビューから新しいテーブル/ビューを作成して、各ユニーク ユーザーをリストし、それらのドキュメント全体をさまざまな年齢グループに分類することです。したがって、列は次のようになります。

ユーザー || # rprts <14 日 || # rprts 14-17 日 || # rprts 18-28 日 || # rprts 29 ~ 44 日 || # rprts 45 日以上

必要なすべてのユーザーのセットを取得できることはわかっています。

SELECT DISTINCT [UserID] FROM [DB].[dbo].[DB_View]

そして、次のコマンドを実行して、UserID をハードコーディングすることで、新しいテーブル/ビューに必要な 1 行を取得できます #:

SELECT DISTINCT 

    [UserID],
    (SELECT COUNT(*) FROM [DB].[dbo].[DB_View] WHERE (Age < 14) AND UserID = '9999') AS "Less Than 14 Days",
    (SELECT COUNT(*) FROM [DB].[dbo].[DB_View] WHERE (Age BETWEEN 14 AND 17) AND UserID = '9999') AS "14 to 17 Days",
    (SELECT COUNT(*) FROM [DB].[dbo].[DB_View] WHERE (Age BETWEEN 18 AND 28) AND UserID = '9999') AS "18 to 28 Days",
    (SELECT COUNT(*) FROM [DB].[dbo].[DB_View] WHERE (Age BETWEEN 29 AND 44) AND UserID = '9999') AS "29 to 44 Days",
    (SELECT COUNT(*) FROM [DB].[dbo].[DB_View] WHERE (Age >= 45) AND UserID = '9999') AS "Over 45 Days"

FROM [DB].[dbo].[DB_View]
WHERE UserID = '9999'

ユーザーの結果セットは約 600 行で、ビューには通常約 6,000 ~ 15,000 行あります。私が最初に考えたのは、ユーザーの結果セットを取得し、各ユーザーをパラメーターに格納し、それをユーザー ID をハードコーディングしたクエリに渡すことでした。悲しいことに、それを行うための SQL を理解することさえできません。(そして、SQL を知っていれば、これを行うためのはるかに効率的な方法があると思います....) カーソルの使用に関するものを見てきましたが、あまりよく理解していません。

何か案は?

4

2 に答える 2

3

私があなたを正しく理解しているなら:

SELECT [UserID],
    COUNT(CASE WHEN Age < 14 THEN 1 ELSE NULL END) AS [Less Than 14 Days],
    COUNT(CASE WHEN Age BETWEEN 14 AND 17 THEN 1 ELSE NULL END) AS [14 to 17 Days],
    COUNT(CASE WHEN Age BETWEEN 18 AND 28 THEN 1 ELSE NULL END) AS [18 to 28 Days],
    COUNT(CASE WHEN Age BETWEEN 29 AND 44 THEN 1 ELSE NULL END) AS [29 to 44 Days],
    COUNT(CASE WHEN Age >= 45 THEN 1 ELSE NULL END) AS [Over 45 Days]

FROM [DB].[dbo].[DB_View]
GROUP BY [UserID]
于 2012-08-29T20:30:08.603 に答える
0

これは、単純な group by と、年齢による条件付き合計の CASE ステートメントを使用して行うことができます。

SELECT [UserID],
       SUM(case when Age < 14 then 1 else 0 end) AS "Less Than 14 Days",
       SUM(case when Age BETWEEN 14 AND 17 then 1 else 0 end) as "14 to 17 Days",
       SUM(case when Age BETWEEN 18 AND 28 then 1 else 0 end) as "18 to 28 Days",
       SUM(case when Age BETWEEN 29 AND 44 then 1 else 0 end) as "29 AND 44 Days",
       SUM(case when Age BETWEEN 29 AND 44 then 1 else 0 end) as "29 AND 44 Days",
       SUM(case when Age >= 45 then 1 else 0 end) as "Over 45 Days"
from [DB].[dbo].[DB_View] 
where  UserID = '9999'
group by userID
于 2012-08-29T20:35:13.487 に答える