2

このテーブルとコードを使用してクエリを作成する際に問題があります。「GROUP BY Branch.BranchName」が複数のレコードを取得する原因であることはわかっていますが、これを回避して単一のクエリでそれを行うにはどうすればよいでしょうか。私が取得しようとしているのは、BranchName を含むテーブルです - 合計支払額 - 合計支払額なし

SELECT
    (
        SELECT SUM (DeptDesciption.DeptValue)
        FROM dbo.SudentPayments
            INNER JOIN dbo.Student ON dbo.SudentPayments.StudentId = dbo.Student.StudentId
            INNER JOIN dbo.DeptDesciption ON SudentPayments.DeptDesciptionId = DeptDesciption.DeptDesciptionId
            INNER JOIN dbo.Branch on dbo.Branch.BranchId = Student.BranchId
        WHERE SudentPayments.IsDeptPayed = 0
        GROUP BY Branch.BranchName
    ) AS Payed,
    (
        SELECT SUM (DeptDesciption.DeptValue)
        FROM dbo.SudentPayments
            INNER JOIN dbo.Student ON dbo.SudentPayments.StudentId = dbo.Student.StudentId
            INNER JOIN dbo.DeptDesciption ON SudentPayments.DeptDesciptionId = DeptDesciption.DeptDesciptionId
            INNER JOIN dbo.Branch on dbo.Branch.BranchId = Student.StudentId
        WHERE SudentPayments.IsDeptPayed = 1
        GROUP BY Branch.BranchName
    ) AS Notpayed,
    Branch.BranchName
FROM dbo.SudentPayments 
    INNER JOIN dbo.Student ON dbo.SudentPayments.StudentId = dbo.Student.StudentId
    INNER JOIN dbo.DeptDesciption ON SudentPayments.DeptDesciptionId = DeptDesciption.DeptDesciptionId
    INNER JOIN dbo.Branch on dbo.Branch.BranchId = Student.StudentId
4

2 に答える 2

3

エラーは自明です。サブクエリ内で複数の結果を返していますが、これは許可されていません。論理的に考えると、複数の行がある場合、どの行を表示すればよいでしょうか?

この問題が発生している理由は、グループ化したにもかかわらずbranch.BracnName、外部クエリにリンクしていないため、サブクエリがすべてのブランチの結果を返しているためです。次のようなものが必要です。

SELECT
    (
        SELECT SUM (dd.DeptValue)
        FROM dbo.SudentPayments sp
            INNER JOIN dbo.Student s ON dbo.sp.StudentId = s.StudentId
            INNER JOIN dbo.DeptDesciption dd ON sp.DeptDesciptionId = dd.DeptDesciptionId
        WHERE s.IsDeptPayed = 0
        AND s.BranchID = Branch.BranchID    -- LINK TO OUTER BRANCH TABLE
    ) AS Payed
FROM dbo.Branch

ただし、相関サブクエリを必要とせずに、クエリ全体を次のようにコールドに書き換えることができます。相関サブクエリを回避できる場合は、通常は良い考えです。一部の DBMS では、オプティマイザーはいくつかのサブクエリを最適化して結合に変換できますが、相関サブクエリを使用した最も単純な用語では、各行に対してサブクエリを 1 回実行するように要求しているため、結合を使用するよりもはるかに多くのオーバーヘッドが発生します。

SELECT  Branch.BranchName, 
        Payed = SUM(CASE WHEN SudentPayments.IsDeptPayed = 1 THEN DeptDesciption.DeptValue ELSE 0 END),
        Notpayed = SUM(CASE WHEN SudentPayments.IsDeptPayed = 0 THEN DeptDesciption.DeptValue ELSE 0 END)
FROM    dbo.SudentPayments
        INNER JOIN dbo.Student 
            ON dbo.SudentPayments.StudentId = dbo.Student.StudentId
        INNER JOIN dbo.DeptDesciption 
            ON SudentPayments.DeptDesciptionId = DeptDesciption.DeptDesciptionId
        INNER JOIN dbo.Branch 
            ON dbo.Branch.BranchId = Student.StudentId
GROUP BY Branch.BranchName;
于 2013-06-26T15:39:16.810 に答える