Muti Row Выбрать подзапрос - PullRequest
       1

Muti Row Выбрать подзапрос

0 голосов
/ 12 августа 2011

У меня 3 запроса, и они работают нормально.Доступны следующие запросы:

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

над результатами запроса:

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

над результатами запроса:

SALESRETURNS
1
2
3

есть ли способ объединить эти операторы, чтобы получить результат как

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

Ответы [ 4 ]

3 голосов
/ 12 августа 2011

Вы не упомянули, используете ли вы MS Sql Server или Oracle, я предполагаю, что MS:)

Используйте CASE, и вы можете построить матрицу с желаемым результатом:

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
0 голосов
/ 12 августа 2011

Возможно ужасно неэффективно, но у меня работает на 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
0 голосов
/ 12 августа 2011

Я думаю, что это работает, но я не проверял. Я добавляю столбец с поддельным идентификатором, присваиваю ему значение «x» и соединяю 3 набора результатов, используя этот новый идентификатор:

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 голосов
/ 12 августа 2011

В зависимости от того, какой продукт базы данных вы используете, вам может потребоваться немного изменить его, но что-то вроде этого должно работать для вас:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...