2011-08-12 8 views
0

3つのクエリがあり、正常に動作します。クエリがあります:クエリ結果の上Muti Rowサブを選択してください。

NETSALES 
1 
2 
3 

SELECT SUM(SALES)as FRESHRETURNS FROM Sales WHERE DOCREF='2'GROUP BY GEOCODE 

:クエリ結果の上

FRESHRETURNS 
1 
2 
3 

SELECT SUM(SALES)as SALESRETURNS FROM Sales WHERE DOCREF='3'GROUP BY GEOCODE 

:クエリ結果の上

SELECT SUM(SALES)as NETSALES FROM Sales WHERE DOCREF='1'GROUP BY GEOCODE 

SALESRETURNS 
1 
2 
3 

が結合するどのような方法がありますこれらの文は、彼はあなたがMS SQL ServerまたはOracleを使用している場合、私はCASEのMS :)

メイクの使用と仮定しています言及しなかった

 NETSALES |  FRESHRETURNS  | SALESRETURNS 
1------1-------|-----------1-----------|--------1-------- 
2------2-------|-----------2-----------|--------2-------- 
3------3-------|-----------2-----------|--------3-------- 
+2

に私の作品:私は、偽のID列を追加し、それは「X」に価値を与え、この新しいIDを使用して3つの結果セットに参加しています**データベースとバージョン** SQL **は単なる構造化照会言語です** **多くの**データベースシステムで使用されている言語** ** SQL **はデータベース製品ではありません...... –

+0

私はMSSQL 2005を使用しています – Shoukat

答えて

3

その結果、あなたは基本的には、結果の行列を構築することができます欲しい:

CREATE TABLE #t 
(
    Sale int, 
    DocRef varchar(1), 
    GeoCode varchar(1) 
) 

INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(100, '1', 'A') 
INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(120, '1', 'A') 
INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(110, '2', 'B') 
INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(120, '2', 'B') 
INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(100, '3', 'C') 
INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(100, '3', 'C') 
INSERT INTO #t(Sale, DocRef,GeoCode) VALUES(100, '3', 'A') 


SELECT 
     CASE WHEN DocRef='1' THEN SUM(Sale) ELSE 0 END as NETSALES,  
     CASE WHEN DocRef='2' THEN SUM(Sale) ELSE 0 END AS FRESHRETURNS,  
     CASE WHEN DocRef='3' THEN SUM(Sale) ELSE 0 END AS SALESRETURNS 
FROM  
    #t 
GROUP BY  
    GeoCode, 
    DocRef 

DROP TABLE #t 
+1

答えを投稿する前に、リフレッシュすることを学ぶことをお勧めします。 UNIONSを使用するよりもはるかに優れています。 – Jesse

+0

これはうまくいきますが、これはジオコードが同時にNETSALES、FRESHRETURNS、SALESRETURNSのすべてであることに対処できないという問題があります – Shoukat

0

どのデータベースを使用している製品によっては、このビットを微調整する必要があるかもしれませんが、このような何かがあなたのために働く必要があります。

SELECT GEOCODE, SUM(NETSALES), SUM(FRESHRETURNS), SUM(SALESRETURNS) 
FROM 
(
    SELECT GEOCODE, SUM(SALES)as NETSALES, 0 AS FRESHRETURNS, 0 AS SALESRETURNS FROM Sales WHERE DOCREF='1'GROUP BY GEOCODE 
    UNION ALL 
    SELECT GEOCODE, 0 AS NETSALES, SUM(SALES)as FRESHRETURNS, 0 AS SALESRETURNS FROM Sales WHERE DOCREF='2'GROUP BY GEOCODE 
    UNION ALL 
    SELECT GEOCODE, 0 AS NETSALES, 0 AS FRESHRETURNS, SUM(SALES)as SALESRETURNS FROM Sales WHERE DOCREF='3'GROUP BY GEOCODE 
) AS salesData 
GROUP BY GEOCODE 
+0

これは問題なく動作しますが、このステートメントの結果は、 group by節の使用 – Shoukat

+0

GEOCODEの内部/外部にグループを維持するために追加されました。今試してみてください。 – Jesse

0

私はこれが動作すると思いますが、私はテストしていません。 **おそらくひどく非効率的

select t.NETSALES, ta.FRESHRETURNS , tb.SALESRETURNS from 
(SELECT 'x' as ID, SUM(SALES)as NETSALES FROM Sales WHERE DOCREF='1'GROUP BY GEOCODE,ID) as t 

inner join 
(SELECT 'x' as ID, SUM(SALES)as FRESHRETURNS FROM Sales WHERE DOCREF='2'GROUP BY GEOCODE,ID) ta on ta.ID=t.ID 

inner join 
(SELECT 'x' as ID SUM(SALES)as SALESRETURNS FROM Sales WHERE DOCREF='3'GROUP BY GEOCODE,ID) tb on tb.ID=t.ID 
+0

これは実行されますが、必要な結果は得られません – Shoukat

0

が、Oracle

SELECT (SELECT SUM(SALES) FROM Sales WHERE DOCREF='1'GROUP BY GEOCODE) NETSALES, 
    (SELECT SUM(SALES) FROM Sales WHERE DOCREF='2'GROUP BY GEOCODE) FRESHRETURNS , 
    (SELECT SUM(SALES) FROM Sales WHERE DOCREF='3'GROUP BY GEOCODE) SALESRETURNS FROM DUAL 
関連する問題