Присоединитесь к двум запросам SQL

Вы можете использовать std :: ws для извлечения любых пробельных символов во входном буфере перед использованием getline. Заголовок для std :: ws является sstream.

cout << "Enter the number: ";
int number;
cin >> number;
cout << "Enter names: ";
string names;
cin>>ws;
getline(cin, names);
30
задан Svante 19 February 2009 в 13:48
поделиться

6 ответов

Некоторые DBMSs поддерживают FROM (SELECT ...) AS alias_name синтаксис.

Думают о Ваших двух исходных запросах как о временных таблицах. Можно запросить их как так:

SELECT t1.Activity, t1."Total Amount 2009", t2."Total Amount 2008"
FROM (query1) as t1, (query2) as t2
WHERE t1.Activity = t2.Activity
46
ответ дан Liam 11 October 2019 в 13:03
поделиться
SELECT Activity, arat.Amount "Total Amount 2008", abull.Amount AS "Total Amount 2009"
FROM
  Activities a
LEFT OUTER JOIN
  (
  SELECT ActivityId, SUM(Amount) AS Amount
  FROM Incomes ibull
  GROUP BY
    ibull.ActivityId
  ) abull
ON abull.ActivityId = a.ActivityID
LEFT OUTER JOIN
  (
  SELECT ActivityId, SUM(Amount) AS Amount
  FROM Incomes2008 irat
  GROUP BY
    irat.ActivityId
  ) arat
ON arat.ActivityId = a.ActivityID
WHERE a.UnitName = ?
ORDER BY Activity
16
ответ дан Quassnoi 11 October 2019 в 13:03
поделиться

возможно, не самый изящный способ решить это

select  Activity, 
        SUM(Amount) as "Total_Amount",
        2009 AS INCOME_YEAR
from    Activities, Incomes
where Activities.UnitName = ? AND
      Incomes.ActivityId = Activities.ActivityID
GROUP BY Activity
ORDER BY Activity;

UNION

select  Activity, 
        SUM(Amount) as "Total_Amount",
        2008 AS INCOME_YEAR
from Activities, Incomes2008
where Activities.UnitName = ? AND
      Incomes2008.ActivityId = Activities.ActivityID
GROUP BY Activity
ORDER BY Activity;
1
ответ дан Natrium 11 October 2019 в 13:03
поделиться

Если Вы предполагаете, что значения существуют для всех операций за оба года, затем просто делают внутреннее объединение следующим образом

 select act.activity, t1.amount as "Total 2009", t2.amount as "Total 2008"
from Activities as act,
    (select activityid,  SUM(Amount) as amount
    from Activities, Incomes
    where Activities.UnitName = ? AND
          Incomes.ActivityId = Activities.ActivityID
    GROUP BY Activityid) as t1,
    (select activityid, SUM(Amount) as amount
    from Activities, Incomes2008
    where Activities.UnitName = ? AND
          Incomes2008.ActivityId = Activities.ActivityID
    GROUP BY Activityid) as t2
    WHERE t1.activityid= t2.activityid
    AND act.activityId = t1.activityId
    ORDER BY act.activity

, Если Вы не можете принять это, то посмотрите на выполнение внешнего объединения

1
ответ дан Il-Bhima 11 October 2019 в 13:03
поделиться

Я просто использовал бы , Объединение

В Вашем втором запросе добавляет, что дополнительный столбец называет и добавляет '' во всех соответствующих местоположениях в других запросах

Пример

//reverse order to get the column names
select top 10 personId, '' from Telephone//No Column name assigned 
Union 
select top 10 personId, loanId from loan
11
ответ дан cgreeno 11 October 2019 в 13:03
поделиться

Попробуйте это:

select Activity, SUM(Incomes.Amount) as "Total Amount 2009", SUM(Incomes2008.Amount) 
as "Total Amount 2008" from
Activities, Incomes, Incomes2008
where Activities.UnitName = ?  AND
Incomes.ActivityId = Activities.ActivityID  AND
Incomes2008.ActivityId = Activities.ActivityID GROUP BY
Activity ORDER BY Activity;

В основном Вы имеете к таблице JOIN Incomes2008 с выводом Вашего первого запроса.

1
ответ дан Shivasubramanian A 11 October 2019 в 13:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: