HarshadaBS Ответов: 1

Как использовать сводный запрос для разных таблиц и разных столбцов одной и той же таблицы ?


/*Сначала я создал переменную таблицу для требуемых данных. Это будет моя исходная или входная таблица, к которой я хочу применить сводный запрос*/

Объявить @таблице (клиент тип nvarchar(Макс) не нуль,страна тип nvarchar(Макс)не нуль,InvoiceAmount ИНТ не null )
Вставить @подробности
ВЫБРАТЬ РАЗЛИЧНЫЕ
Продолжение.Имя компании в качестве клиента,
Страна.Страна как страна,
Sal.InvoiceAmount

От продаж Сал
Внутреннее соединение контактов Конт Сал.Параметр ClientID=Продолжение.Идентификатор contactid
Странах внутреннее объединение страны на продолжение.CountryID=Страна.CountryID
Где Сэл.SaleID<>0 и
Продолжение ContactID<>0 и
Сэл.InvoiceStatus В ('рублей','РН','РА','вертолет','РТ');
Выберите * от @подробности

/*Мой вывод будет следующим
-------------------------------------------------------------------------------
Название Страна InvoiceAmount
------------------------------------------------------------------------------
Раджа Индия 100.00
Аджит Begium 200.00
Суканья Китай 300.00
Неха Индия 600.00
Раджа Индия 300.00
Аджит Begium 800.00
Суканья Китай 700.00
Неха Индия 600.00
Раджа Бельгия 50,00
Неха Франция 130.00*/
-------------------------------------------------------------------------------
Я получаю этот вывод из вышеприведенного запроса
-------------------------------------------------------------------------------
/*Я хочу применить сводный запрос таким образом, чтобы выходные данные выглядели следующим образом
А)один выход (когда pivot применяется к стране)

Сумма(InvoiceAmount)
---------------------------------------------------------------------------------
Название Индия Бельгия Китай Франция
---------------------------------------------------------------------------------
Раджа 400.00 50.00

Аджит 10000.00

Суканья 10000.00

Неха 12000.00 130.00
--------------------------------------------------------------------------------

Б)второго выхода(для поворота применяется на имя)
Сумма(InvoiceAmount)
------------------------------------------------------------------------------
Страна Раджа Аджит Суканья Неха
------------------------------------------------------------------------------
Индия 400.00 12000.00

Бельгия 50.00 10000.00

Китай 10000.00

Франция 130.00
------------------------------------------------------------------------------
Все эти выходные данные "а" и "в" должны исходить из одного и того же запроса. Для этого я использовал табличные переменные и переменные столбцов.
*/
--------------------------------------------------------------------------------
/*Я написал следующий запрос, но получил ошибку. Запрос не работает должным образом. Пожалуйста, помогите мне решить эти вопросы. Я даю свой код здесь*/

/*Целью этого запроса является использование Pivot, Но данные могут быть извлечены из любой таблицы и любых столбцов соответствующей таблицы.
Здесь используется таблица "@Details", которая является табличной переменной, как InputTable. Столбцы могут быть любыми, начиная с "@Details".
Это означает, что если переменная столбца изменяется в запросе, то pivot должен быть выполнен на уважаемом столбце
Я делаю это потому, что хочу использовать один и тот же запрос для нескольких целей*/

ОБЪЯВИТЬ @QUERY КАК NVARCHAR(MAX),
@COLSPIVOT AS NVARCHAR(МАКС),
@Клиент как NVARCHAR(макс.),
@Страна как NVARCHAR(макс.),
@InvoiceAmount AS NVARCHAR(макс.),
@InputTable AS NVARCHAR(макс.),
@COLSUNPIVOT AS NVARCHAR(МАКС)
SET @Client = 'клиент'
В @Страна=''
SET @InvoiceAmount = 'InvoiceAmount'
SET @InputTable = '@Details'






Выберите @COLSUNPIVOT = 'вещи((выбор ","+функции quotename([@клиент])
Из '+ @InputTable + ' как C
ДЛЯ XML-ПУТИ(")), 1, 1, ")'

Выберите @COLSPIVOT = 'вещи((выбрать различные "," + функции quotename([@страна])
Из '+ @InputTable + ' для XML путь("), типа).значение(".", 'ТИП NVARCHAR(МАКС)') ,1,1,")'

НАБОР @ЗАПРОСОМ
= 'SELECT DISTINCT '+@Client+', '+@COLSPIVOT+'
ОТ
(
Выберите различные '+@Country+','+@Client+','+@InvoiceAmount+' из ' + @InputTable + '
)Тэ
СТЕРЖЕНЬ
(
SUM(['+@InvoiceAmount+'])
Для страны в ('+@COLSPIVOT+')
) ПИВ'

EXEC(@QUERY)

Что я уже пробовал:

Пожалуйста, помогите мне решить эту проблему. Я описал свой вопрос о SQL PIVOT query. Если есть какие-либо проблемы, чтобы понять этот вопрос, пожалуйста, дайте мне знать.
@Детальный Вывод
-------------------------------------------------------------------------------
Название Страна InvoiceAmount
------------------------------------------------------------------------------
Раджа Индия 100.00
Аджит Begium 200.00
Суканья Китай 300.00
Неха Индия 600.00
Раджа Индия 300.00
Аджит Begium 800.00
Суканья Китай 700.00
Неха Индия 600.00
Раджа Бельгия 50,00
Неха Франция 130.00*/
-------------------------------------------------------------------------------
Требуемый вывод/*я снова пытаюсь ввести вывод, потому что он неправильно отображается. Но это бесполезно. Поэтому я уже упоминал, что это сумма InvoiceAmount*/
А)один выход (когда pivot применяется к стране)
Сумма(InvoiceAmount)
---------------------------------------------------------------------------------
Название Индия Бельгия Китай Франция
---------------------------------------------------------------------------------
Раджа 400.00 50.00

Аджит 10000.00

Суканья 10000.00

Неха 12000.00 130.00
--------------------------------------------------------------------------------

Б)второго выхода(для поворота применяется на имя)
Сумма(InvoiceAmount)
------------------------------------------------------------------------------
Страна Раджа Аджит Суканья Неха
------------------------------------------------------------------------------
Индия 400.00 12000.00

Бельгия 50.00 10000.00

Китай 10000.00

Франция 130.00
------------------------------------------------------------------------------

1 Ответов

Рейтинг:
0

Santosh kumar Pithani

DROP TABLE IF EXISTS #Demo;
CREATE TABLE #Demo(Client VARCHAR(50), Country VARCHAR(50), 
                  InvoiceAmount DECIMAL(5,2))
INSERT INTO #Demo 
 VALUES
  ('Raja','India',100.00),('Ajit','Begium',200.00),('Sukanya','China',300.00),
  ('Neha','India',600.00),('Raja','India',300.00),('Ajit','Begium',800.00),
  ('Sukanya','China',700.00),('Neha','India',600.00),('Raja','Belgium',50.00),
  ('Neha','France',130.00);

DECLARE	@QUERY AS NVARCHAR(MAX);
DECLARE @Col1 AS NVARCHAR(50)='Country'; --'CLIENT'
DECLARE @Col2 AS NVARCHAR(50)='CLIENT'; --'Country';
DECLARE @Col3 AS NVARCHAR(50)='InvoiceAmount';
DECLARE @InputTable AS NVARCHAR(50)='#DEMO';
DECLARE @PivotRows AS NVARCHAR(MAX);
DECLARE @Pvtab TABLE(Cols varchar(max));
DECLARE @Pvtab_task TABLE(Col2 Varchar(max));
DECLARE @Pvtcol Nvarchar(max);
Declare @P_task Nvarchar(max);

SET @P_task = N'SELECT STUFF((SELECT Distinct '',''+''ISNULL(''+'+@col2+'+'',0.00) AS [''+'+@col2+'+'']'' FROM '+@InputTable+' AS C 
              FOR XML PATH(''''),Type).value(''.'',''NVARCHAR(MAX)''), 1, 1,'''');'

insert into @Pvtab_task (Col2) exec(@P_task);

SET @PivotRows =N'SELECT STUFF((SELECT DISTINCT '',''+QUOTENAME('+@Col2+',''['') 
               FROM ' + @InputTable + ' AS C 
               FOR XML PATH(''''),Type).value(''.'',''NVARCHAR(MAX)''), 1, 1,'''');'

INSERT INTO @Pvtab(Cols) EXEC(@PivotRows);
SELECT @Pvtcol=Cols FROM @Pvtab; 
---print @pvtcol
SET @QUERY = N'SELECT DISTINCT '+@Col1+','+(select col2 from @Pvtab_task )+' FROM ' + 
             @InputTable + ' 
               PIVOT (SUM(['+@Col3+']) FOR '+@Col2+' IN ('+@Pvtcol+'))AS PIV'

EXEC(@QUERY)

---------------------------------------
Country	Ajit	Neha	Raja	Sukanya
------------------------------------------
Begium	1000.00	0.00	0.00	0.00
Belgium	0.00	0.00	50.00	0.00
China	0.00	0.00	0.00	1000.00
France	0.00	130.00	0.00	0.00
India	0.00	1200.00	400.00	0.00


HarshadaBS

Прежде чем попробовать этот запрос, я хочу спросить вас, не могли бы вы объяснить, почему вы использовали временную таблицу (#Demo) вместо табличной переменной(ex. @Таблица)?

Santoshkumar Pithani

Вы можете использовать любую таблицу для демонстрации ,но таблица @variable должна быть внутри динамического запроса.

HarshadaBS

Этот Запрос Работает Правильно

HarshadaBS

Чтобы избежать нулевых значений и заменить их на "0", тогда каков будет синтаксис? Я пытаюсь, но это дает синтаксическую ошибку.

HarshadaBS

/*Что-то вроде этого...Но этот запрос неверен*/
Набор @PivotRows =Н выбрать вещи((выбрать различные ",функция isnull('+функции quotename('+@столбец col2+',"[")+',0.0)как'+функции quotename('+@столбец col2+',"[")+"
Из '+ @InputTable + ' как C
По пути в XML(""),типа).значение(".","ТИП NVARCHAR(МАКС)"), 1, 1,"");'

Santosh kumar Pithani

Я думаю,что проблема преобразования типов данных, поэтому конвертируйте 0.0 как varchar

HarshadaBS

Можете ли вы поделиться синтаксисом, чтобы избежать нулевых значений?

Santosh kumar Pithani

Дайте мне знать, что именно вам нужно.

HarshadaBS

Ваш запрос дает правильный вывод. Я не хочу менять выход. Я просто хочу заменить все нулевые значения на 0. Вот что мне нужно и нужен синтаксис для преобразования нулевых значений в 0. Но используйте только приведенный выше код. Не пишите отдельный синтаксис для isnull.

HarshadaBS

Я хочу сказать ... .. В вашем запросе, как я могу преобразовать нулевые значения с 0? Пожалуйста, дайте мне синтаксис.

Santosh kumar Pithani

Создать таблицу #Demo(клиент VARCHAR(50), страна VARCHAR(50),
InvoiceAmount DECIMAL(5,2))
Вставить в #Demo
ЦЕННОСТИ
('Раджа','Индия',100.00),('А.','Begium',200.00),('Суканья',нуль,300.00),
('Племянница','Индия',600.00),('Раджа',нуль,300.00),('А.','Begium',800.00);

Объявить @Pivotcols Nvarchar(макс.);
Объявить @pivoting nvarchar(макс.);
Declare @col2 nvarchar(50)='страна';
Declare @InputTable nvarchar(500)='#demo';
Набор @Pivotcols = Н выбрать вещи((выбрать различные ","+"литые(["+функция isnull('+@столбец col2+',0)+"] как varchar(20)), а ["+функция isnull('+@столбец col2+',0)+"]" С '+@InputTable+' как C
По пути в XML(""),типа).значение(".","ТИП NVARCHAR(МАКС)"), 1, 1,"");'
exec(@Pivotcols);
Набор @поворачивающимся=Н выбрать вещи((выбрать различные ","+" ["+функция isnull('+@столбец col2+',0)+"]" С '+@InputTable+' как C
По пути в XML(""),типа).значение(".","ТИП NVARCHAR(МАКС)"), 1, 1,"");'

exec(@pivoting);

Santosh kumar Pithani

После удаления комментариев отката нет, но вы можете прочитать все сообщения в MessageBox, мой последний комментарий - "всегда добро пожаловать! :)"

HarshadaBS

Окей. Я новичок в CodeProject. Но это очень хороший опыт, чтобы узнать больше о кодировании