2012-06-28 3 views
0

Допустим, у меня есть таблица со следующими даннымиSQL - Динамически генерируемые выберитеПрисоединениедля заявление на основе некоторого условия

клиента таблица:

Name  amount date_created invoice_number 
-------------------------------------------------- 
John  50   11April2012   12 
Bob  150  15April2012   32 
David 506  10May2012   52 
Paul  80   12Aug2012   12 
Mark  10   11Jan2012   52 

Сводная таблица:

Name  amount 
--------------------- 
Sally  250 
Darren-32 150 

I хотел бы выбрать все строки, где date_created находится между start_date и end_date текущего_квартала. Если date_created находится в текущем квартале, я хотел бы добавить имя invoice_number к имени, прежде чем делать инструкцию insert (см. Пример в сводной таблице выше).

INSERT summary(name, amount) 
SELECT name|| '-' || invoice_number, date_created, invoice_number 
From Customer; 
  • Как я могу изменить выше, чтобы использовать любую функцию «Decode» или функцию «Case» (или любой другой «IF оператор» тип функции), чтобы проверить значение date_created и добавить INVOICE_NUMBER если date_created находится в текущем квартале.

  • Очевидно, что мне нужно будет знать даты начала и окончания текущего квартала и вам нужно будет их хранить где-то перед выполнением сравнения. Это вообще возможно с чистым SQL? PL/SQL не является вариантом.

Предположим, что мы находимся в 1 квартале (апрель - июнь) конечный результат должен быть:

Name  amount 
--------------------- 
Sally  250 
Darren-32 150 
John-12  50 
Bob-32  150 
David-52 506 
Paul  80 
Mark  10 

Я читаю таблицу клиентов из базы данных Oracle 10G и заполнение резюме в «Резюме» таблицу, которая находится в базе данных SQL-сервера. Тот факт, что я вставляю в базу данных SQL Server, не имеет большого значения. Я читаю данные из базы данных Oracle, поэтому синтаксис должен быть совместим с Oracle.

ответ

1

Синтаксис Oracle делать то, что вы описали в своих двух пулевых точек будет

SELECT (CASE WHEN  date_created >= trunc(sysdate,'Q') 
        AND date_created < trunc(add_months(sysdate,3),'Q') 
      THEN name || '-' || invoice_number 
      ELSE name 
     END), 
     date_created, 
     invoice_number 
    FROM Customer; 
1
declare @CurrentQtr int 
set @CurrentQty = CASE 
    WHEN datepart(month, getdate()) in (1,2,3) THEN 1 
    WHEN datepart(month, getdate()) in (4,5,6) THEN 2 
    WHEN datepart(month, getdate()) in (7,8,9) THEN 3 
    ELSE 4 END 

SELECT name + case 
    WHEN datepart(month, date_created) in (1,2,3) AND @CurrentQtr = 1 THEN '-' + invoice_number 
    WHEN datepart(month, date_created) in (4,5,6) AND @CurrentQtr = 2 THEN '-' + invoice_number 
    WHEN datepart(month, date_created) in (7,8,9) AND @CurrentQtr = 3 THEN '-' + invoice_number 
    WHEN datepart(month, date_created) in (10,11,12) AND @CurrentQtr = 4 THEN '-' + invoice_number 
    ELSE '' end as Name, amount 
From Customer; 
+0

Извините, что это синтаксис SQL, но не сложно преобразовать эти функции в Oracle :) Вы получаете идею. – Mangist

1

Что-то вроде этого?

insert summary 
Select 
    Name || case 
     when datepart(dp_quarter, sysdate)=datepart(dp_quarter, date_Created) 
    and extract(year from sysdate) = extract(year from date_Created) 
     then '-' || invoice_number 
     else '' end, 
amount from Customer 
Смежные вопросы