ahmed_sa Ответов: 2

Я получаю ошибку при объединении все запросы, объединенные с помощью оператора UNION, INTERSECT или EXCEPT, должны иметь равное количество выражений в своих целевых списках.


проблема

All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
?

Мне нужно добавить структуру строк таблицы в качестве первой строки так что на самом деле мне нужно сделать это следующим образом


я буду отображать данные плюс один дисплей записи в качестве первой строки в качестве структуры данных

желаемым результатом являются следующие данные

жирный ряд мне нужно добавить

ItemId	IPN	PartnerName	CustomerName	Fan	Motor	Refrigator	temprature
ItemId	IPN	PartnerName	CustomerName	Fan	Motor	Refrigator	temprature
1	1233	Saico	NULL	NULL	NULL	NULL	55567
2	5433	Mbaby	NULL	23444	NULL	NULL	NULL
3	590444	nagieb	NULL	NULL	NULL	556666	NULL

таблица данных
datafeatures[^]

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

create table #ItemFeatures
(

CustomerName nvarchar(200),
CustomerId nvarchar(50)

)

insert into #ItemFeatures
(
CustomerName
)



values
('Avidyne')


Exec(@sql)

update tmp
set tmp.CustomerId = c.CustomerID
from #ItemFeatures tmp inner join pcn.Customers c on c.CustomerName = tmp.CustomerName

DECLARE @Columns as VARCHAR(MAX)
SELECT @Columns =
COALESCE(@Columns + ', ','') + QUOTENAME(FeatureName)
FROM
--select distinct Features
(select distinct FeatureName from [CustomerLocations].[FeatureTypes]

) AS B
ORDER BY B.FeatureName


--select @Columns
--pivot table make count for item to every Feature Based on features Name
DECLARE @SQLs as VARCHAR(MAX)

SET @SQLs = 'select  ''ItemId'', ''IPN'',''PartnerName'',''CustomerName'',
       '' + @Columns + '' union all
SELECT ItemId,IPN,PartnerName,CustomerName,' + @Columns + '
FROM
(
select F.ItemId ,t.FeatureName,F.FeatureValue,I.IPN,I.PartnerName,FI.CustomerName
from [CustomerLocations].[ItemFeatures] F
Inner Join [CustomerLocations].[Items] I ON F.ItemId=I.ItemId
inner join CustomerLocations.FeatureTypes T on T.FeatureId=F.FeatureId
inner join #ItemFeatures FI on I.CustomerID=FI.CustomerID



) as PivotData
PIVOT
(
max(FeatureValue)
FOR FeatureName IN (' + @Columns + ')
) AS PivotResult
'

EXEC(@SQLs)

2 Ответов

Рейтинг:
8

ZurdoDev

Ошибка означает, что выбранные элементы имеют разное количество столбцов. Вы пропускаете какую-то колонку или слишком много в другой.

Например, этот sql выдаст эту ошибку:

SELECT field1
FROM table1
UNION ALL
SELECT field1, field2
FROM table2


Добавьте инструкции PRINT @sqls или отладьте их и выполните пошаговое выполнение, чтобы вы могли видеть, что происходит на самом деле. Похоже , что ваша переменная @columns может заканчиваться на букву "а".


ahmed_sa

моя проблема в переменных @Columns перед объединением все не показывают динамических значений, но после объединения все они отображают динамические значения, так как решить эту проблему

ZurdoDev

Я не понимаю, о чем вы говорите. Как бы то ни было, вам нужно его отладить. Мы не можем сделать это для вас.

Рейтинг:
1

Richard Deeming

Цитата:
SET @SQLs = 'select  ''ItemId'', ''IPN'',''PartnerName'',''CustomerName'',
       '' + @Columns + '' union all
SELECT ItemId,IPN,PartnerName,CustomerName,' + @Columns + '
FROM
Подсветка синтаксиса здесь должна дать вам ключ к разгадке.

Ваша первая строка не содержит того же количества столбцов, что и сводные данные. Он всегда содержит пять значений:
  • "ItemId"
  • "IPN"
  • "PartnerName"
  • "CustomerName"
  • " + @Columns + "

Этот последний не является списком имен объектов; это буквальная строка " + @Columns + ".

Это то, что лучше всего обрабатывается в пользовательском интерфейсе. Но если вы действительно хотите придерживаться SQL, вам понадобится отдельная переменная для хранения значений строки заголовка:
DECLARE @Columns As varchar(max), @ColumnHeadings As varchar(max);

SELECT 
    @Columns = IsNull(@Columns + ', ','') + QUOTENAME(FeatureName),
    @ColumnHeadings = IsNull(@ColumnHeadings + ', ', '') + '''' + Replace(FeatureName, '''', '''''') + ''''
FROM
    (SELECT DISTINCT FeatureName from [CustomerLocations].[FeatureTypes]) As B
ORDER BY 
    B.FeatureName
;


DECLARE @SQLs As varchar(max);

SET @SQLs = 'SELECT ''ItemId'', ''IPN'', ''PartnerName'', ''CustomerName'', ' + @ColumnHeadings + '
UNION ALL
SELECT ItemId, IPN, PartnerName, CustomerName, ' + @Columns + '
FROM
(
    SELECT F.ItemId, t.FeatureName, F.FeatureValue, I.IPN, I.PartnerName, FI.CustomerName
    FROM [CustomerLocations].[ItemFeatures] F
    INNER JOIN [CustomerLocations].[Items] I ON F.ItemId = I.ItemId
    INNER JOIN CustomerLocations.FeatureTypes T ON T.FeatureId = F.FeatureId
    INNER JOIN #ItemFeatures FI ON I.CustomerID = FI.CustomerID
) As PivotData
PIVOT
(
    Max(FeatureValue)
    FOR FeatureName IN (' + @Columns + ')
) AS PivotResult';

EXEC(@SQLs);