2012-03-01 17 views
1

クエリの戻り値を8つのフィールドにし、1つのフィールドでグループ化し、別のフィールドで1つの集計関数のみを実行する方法はありますか? 集計関数を持たないすべてのフィールドでグループ化する必要があることを示すエラーが表示されます。SQL GROUPBYへの代入(集計フィールドの繰り返しを避けるなど)

私は毎月のために完了した調査の数を見つける必要があるが、私はこれを実行しようとすると、このようなセッションSTARTTIME、セッションステータス、セッションIDなど

などの他の情報を含める必要があります。

SELECT Datepart("m", starttime), 
     COUNT(sessionid), 
     sessionstatus, 
     starttime, 
     endtime, 
     surveyid, 
     surveybook, 
     userdesk 
FROM survey_sessions 
GROUP BY Datepart("m", starttime) 

私はエラーを取得する: は私がによって他の凝集体およびグループ化を必要としない

「あなたは、集計関数の一部として指定された式 『SessionStatus』を含まないクエリを実行しようとしました」残りのフィールドは私に毎月合計を得る能力を与えません。

+0

あなたはどのDBを使用していますか?他の値には何を望みますか?その月の最初の行からの値。最後の行任意の行ですか? –

答えて

1

仕事だと思います。

group by節にすべてを含めておけば、その多くの列をグループ化するときにすべての行が非常にユニークであると仮定しているため、おそらく期待した結果が得られません。 SQL Serverを使用していると仮定すると、

は試みることができる:

SELECT Datepart("m", starttime), 
    COUNT(sessionid) OVER(PARTITION BY Datepart("m", starttime)) AS Count, 
    sessionstatus, 
    starttime, 
    endtime, 
    surveyid, 
    surveybook, 
    userdesk 
FROM survey_sessions 

これはあなたがそれぞれの行に表示どのように多くの月に発生したのカウントで探しているすべての情報が表示されます。

私はあなたが達成しようとしていることを100%確信していないので、より具体的にするのは難しいです。

EDIT:アクセスのための代替ソリューションを追加しています。

アクセスでも動作する必要がある場合は、次の方法をお試しください。 ''を最初のクエリが返すデータ型に対応する数値、日付、または文字列に置き換えます。これにより、クエリの末尾に各月の合計が表示されます。

SELECT Datepart("m", starttime), 
    0 AS COUNT 
    sessionstatus, 
    starttime, 
    endtime, 
    surveyid, 
    surveybook, 
    userdesk 
FROM survey_sessions 

UNION ALL 

SELECT Datepart("m", starttime), 
    COUNT(sessionid) as Count, 
    '', 
    '', 
    '', 
    '', 
    '', 
    '' 
FROM survey_sessions 
GROUP BY Datepart("m", starttime) 
+0

これは動作します続行サーバーのために、しかし残念なことに私はアクセスのための解決策が必要です。私は周りを検索し、同じ結果を与える何かを見つけることができませんでした。 )OVER(区切り文字(Datepart( "m"、starttime)) ' –

+0

上記の編集を最下部で試してみてください。一番下に戻り、まだデータ行の数も同様です。 – jmshapland

+0

これはうまくいきます。あなたは '0 AS COUNT'の後にコンマを残し、 'COUNT(sessionid)as Count'を残しました。ありがとう!! –

0

GROUP BY句で非集計列の全てを含めても害はありません...

+0

PS:私の担当者が投稿した質問にコメントする認証はありません。 – Teja

0

をあなたは1列にグループ化されていますが、SELECT句で複数のカラムを持っています。通常は、単純なコピーと選択列からの貼り付けです。構文上、少し重複していますが、同じ結果が得られます。あなたの新しいクエリ:MS-Accessに

SELECT 
    Datepart("m", starttime) 
    ,COUNT(sessionid) 
    ,sessionstatus 
    ,starttime 
    ,endtime 
    ,surveyid 
    ,surveybook 
    ,userdesk 
FROM survey_sessions 
GROUP BY 
    Datepart("m", starttime) 
    ,sessionstatus 
    ,starttime 
    ,endtime 
    ,surveyid 
    ,surveybook 
    ,userdesk 
+0

「残りのフィールドでグループ分けしても月額合計を得ることはできません」という質問から、この部分を逃したと思います。 –

1

Since searches for the error messageポイントの最も簡単な方法は、あなたがCOUNT OVERをシミュレートするために探している場合

SELECT Datepart("m", starttime), 
     COUNT(sessionid), 
     FIRST(sessionstatus), 
     FIRST(starttime), 
     FIRST(endtime), 
     FIRST(surveyid), 
     FIRST(surveybook), 
     FIRST(userdesk) 
FROM survey_sessions 
GROUP BY Datepart("m", starttime) 

最初にすることができますので、私はドンので、2を使用したインライン・ビュー(」を使用することですトンあなたは、GROUP BYを使用している場合、式は常に選択したフィールドのすべてがどんなGROUP BYに含まなかったしなければならないアクセスSQLで

SELECT 
     main.Month, 
     q.Kount, 
     main.sessionstatus, 
     main.starttime, 
     main.endtime, 
     main.surveyid, 
     main.surveybook, 
     main.userdesk, 
     main.sessionstatus 
    FROM 
    (SELECT Datepart("m", s.starttime) month, 

     s.sessionstatus, 
     s.starttime, 
     s.endtime, 
     s.surveyid, 
     s.surveybook, 
     s.userdesk 
     FROM survey_sessions) main 
    INNER JOIN (SELECT Datepart("m", starttime) [MONTH], 
         COUNT(sessionid) kount 
        FROM survey_sessions 
        GROUP BY Datepart("m", starttime)) q 
     ON main.month = q.month 
+1

これは非常に便利で、私が投稿した特定の質問に答えますが、パーティションソリューションはすべての行を表示するので一般的に必要なものです。しかし、私は評判のポイントが足りないので、あなたの答えに投票することはできません。 :-( –

+0

@CuriousKodj私はあなたに 'COUNT OVER'をシミュレートするクエリを追加しました。私はDCOUNTも機能するかもしれませんが、しばらくしているように感じます –

+0

これはうまくいきます。私は、どのソリューションがそれほど高価でないかはわかりませんが、上記のすべてのソリューションとの比較ではわかりませんが、私はそれを理解するでしょう。私は本当にすばらしい返答を感謝しています!!あなたたちは最高です!!! –

関連する問題