1

このようなテーブルがあります。このテーブルを呼び出しましょうB

id    boardid    schoolid     subject     cnt1   cnt2  cnt3 ....
=================================================================
1       20         21           f     
2       20         21           r
3       20         21           w
4       20         21           m
5       20         30           r
6       20         30           w
7       20         30           m

カウントが単なる整数であるとします。subject = fforがないことに注意してくださいschoolid = 30。同様に、ほとんどの学校にはsubject存在しない学校もあります。あなたschoolidはちょうどまたはちょうどr, wあるいくつかを持っているかもしれませんr, m, f..

だから私がやりたいのは、学校ごとに4つの一貫した行を持ち、存在しない行にはダミー値が必要です。セカンダリテーブルを作成することを考えました

drop table #A
Select * into #A FROM 
(
select [subject_s] = 'r', orderNo = 1
union all
select [subject_s] = 'w', orderNo = 2
union all
select [subject_s] = 'm', orderNo = 3
union all
select [subject_s] = 'f', orderNo = 4
) z

それらにいくつかの結合を行っていますが、どこにもありません。内部結合、左外部結合、クロス結合、すべてを試しました。私もデカルト積を作ろうとしました。そこにあるため、デカルト積が台無しになっていると思うordernoので、メインテーブルの行ごとに16行になります。実際にこれを入力すると、 を削除しorderno、デカルト積を適用してから orderno を後で追加すると、うまくいくかもしれませんが、皆さんが思いつくものを見てみたいと思います. 私は困惑しています。

最終結果

id    boardid    schoolid     subject     cnt1   cnt2  cnt3 ....
=================================================================
1       20         21           r     
2       20         21           w
3       20         21           m
4       20         21           f
5       20         30           r
6       20         30           w
7       20         30           m
7       20         30           f
4

3 に答える 3

1

次のことを試してください。

SELECT S.boardid, S.schoolid, A.[subject], B.cnt1, B.cnt2, B.cnt3
FROM (SELECT DISTINCT boardid, schoolid FROM YourTable) S
CROSS JOIN #A A
LEFT JOIN YourTable B
    ON B.boardid = S.boardid AND  B.schoolid = S.schoolid 
    AND A.[subject] = B.[subject]
于 2012-11-15T20:30:28.277 に答える
0

あなたが使用しているRDBMSがわからないのでsqlite、より単純なテーブルで次のことを試しました:

sqlite> create table schools (name varchar, subject varchar, teacher varchar);

sqlite> select * from schools;
School1|Maths|Mr Smith
School2|English|Jack
School3|English|Jimmy
School3|Maths|Jane
School4|Computer Science|Bob

sqlite> select
            schoolnames.name, 
            subjects.subject, 
            ifnull(teachers.teacher, "Unknown") 
        from (select distinct name from schools) schoolnames
        join (select distinct subject from schools) subjects
        left join schools teachers
           on schoolnames.name = teachers.name
              and subjects.subject = teachers.subject;

School1|Maths|Mr Smith
School1|English|Unknown
School1|Computer Science|Unknown

School2|Maths|Unknown
School2|English|Jack
School2|Computer Science|Unknown

School3|Maths|Jane
School3|English|Jimmy
School3|Computer Science|Unknown

School4|Maths|Unknown
School4|English|Unknown
School4|Computer Science|Bob
于 2012-11-15T20:39:25.360 に答える
-1

私は使用します:

SELECT 
    boardid, schoolid, dist_subject, id, cnt1, ...
FROM
    (SELECT 
        boardid, schoolid, dist_subject
    FROM
        (SELECT 
            DISTINCT subject AS dist_subject 
        FROM b ) s full outer join
        (SELECT 
            boardid, schoolid 
        FROM b 
        GROUP BY 
            boardid, schoolid   ) g ) sg LEFT OUTER JOIN
    b ON 
    sg.boardID = b.boardID AND
    sg.schoolid = b.schoolID
    sg.dist_subject = b.subject
于 2012-11-15T20:33:08.993 に答える