2014-12-17 2 views
0

У меня есть столбец ответа, в котором хранятся 2 разных значения для одного и того же продукта на основе вопроса 1 и вопроса 2. Это создает 2 строки для каждого продукта, но я хочу только одну строку для каждого продукта. Пример:2 Строки до 1 строки - вложенный запрос

select Product, XNumber from MyTable where QuestionID IN ('Q1','Q2') 

результат показывает:

Product XNumber 
Bat  abc 
Bat  abc12 

Я хочу, чтобы показать, как показано ниже:

Product Xnumber1 Xnumber2 
Bat  abc  abc12 

Пожалуйста, помогите. Спасибо.

+0

это сводная таблица http://technet.microsoft.com/en -us/library/ms177410% 28v = sql.105% 29.aspx Однако, если строки не будут всегда равными двум, вы должны использовать динамический SQL. Если он постоянный, вы также можете использовать оператор case. – xQbert

+1

Как вы получаете Xnumber1 и Xnumber2? Что делать, если есть более двух строк? PIVOT может делать то, что вы хотите, но этого вопроса гораздо больше, чем кажется. – idstam

+0

Как вы думали об этом? В перспективе или таблица должна быть готова с этими столбцами до начала выполнения? Что вы пробовали? – Jonast92

ответ

0

Это будет работать лучше, если вы не «т иметь ответы как Q1 и Q2 для всех идентификаторов

SELECT a.Product, b.XNumber as XNumber1, c.XNumber as XNumber2 
FROM (SELECT DISTINCT Product FROM MyTable) a 
LEFT JOIN MyTable b ON a.Product = b.Product AND b.QuestionID = 'Q1' 
LEFT JOIN MyTable c ON a.Product = c.Product AND c.QuestionID = 'Q2' 
+0

Отлично. Это сработало. Огромное спасибо. – Bulbul

0

Это один из способов достижения ожидаемых результатов. Однако он полагается на то, что только значения xNumber abc и abc12 являются значениями. Если это не так, то, вероятно, потребуется динамический стержень.

SELECT product, max(case when XNumber = 'abc' then xNumber end) as XNumber1, 
       max(Case when xNumber = 'abc12' then xNumber end) as xNumber2 
FROM MyTable 
GROUP BY Product 

Проблема в том, что SQL должен знать, сколько столбцов будет в результате в момент компиляции SQL. Поскольку число столбцов может зависеть от самих данных (2 строки по 5 строк), он не может выполнить запрос. Используя Dynamic SQL, вы можете узнать количество строк, а затем передать эти значения в качестве имен столбцов, поэтому динамический SQL работает.

+0

Нет, значения XNumber не всегда являются abc и abc12. Результаты Q1 в первом примере строки abc и Q2 приводят к второй строке abc12. Теперь каждый продукт имеет 2 строки с разными XNumber. Надеюсь, что это прояснится. Благодарю. – Bulbul

1

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

SELECT a.Product, a.XNumber as XNumber1, b.XNumber as XNumber2 
FROM MyTable a 
INNER JOIN MyTable b 
ON a.Product = b.Product 
WHERE a.QuestionId = 'Q1' 
AND b.QuestionId = 'Q2' 

Я предполагаю, что XNumber1 является результатом для Q1 и Xnumber2 результат для Q2.

+0

У меня уже есть 5 столов, и ваше решение является самосоединяющимся столом. Это сложно с другими 5 таблицами, но я постараюсь скоро вас обновить. Благодарю. – Bulbul

+0

Это правильное решение. SQL ожидает, что у них будет много объединений. Любое решение с использованием соединений будет самым быстрым решением. – Hogan

+0

Этот запрос не отображал никаких значений в столбцах XNumber1 и XNumber2. – Bulbul

0

Это даст вам два столбца, первый будет продуктом, а второй будет разделен запятыми на список xNumbers.

SELECT DISTINCT T.Product, 
xNumbers = Stuff((SELECT DISTINCT ', ' + T1.XNumber 
         FROM MyTable T1 
         WHERE t.Product = T1.Product 
         FOR XML PATH ('')),1,1,'')   
FROM MyTable T 

Чтобы получить то, что вы хотите, мы должны знать, сколько столбцов будет, что назвать их, и как определить, какое значение переходит в какую колонку

+0

Мне нужны три столбца. 1) Продукт 2) XNumber1 3) XNumber2. В настоящее время значения XNumber1 и XNumber2 хранятся в одном столбце XNumber. Нельзя использовать Distinct, потому что это часть проблемы, которую я обобщаю. – Bulbul

0

использовал rank() много в текущем коде мы работали на в моей повседневной работе. Так что этот забавный вариант пришел на ум для вашего решения.

Использование ранга, чтобы получить 1-й, 2-й и 3-й возможный идентификатор элемента затем группируя их, чтобы создать имитацию pivot

DECLARE @T TABLE (PRODUCT VARCHAR(50), XNumber VARCHAR(50)) INSERT INTO @T VALUES ('Bat','0-12345-98765-6'), ('Bat','0-12345-98767-2'), ('Bat','0-12345-98768-1'), ('Ball','0-12345-98771-6'), ('Ball','0-12345-98772-7'), ('Ball','0-12345-98777-9'), ('Hat','0-12345-98711-6'), ('Hat','0-12345-98712-3'), ('Tee','0-12345-98465-1')

SELECT PRODUCT, MAX(CASE WHEN I = 1 THEN XNumber ELSE '' END) AS Xnumber1, MAX(CASE WHEN I = 2 THEN XNumber ELSE '' END) AS Xnumber2, MAX(CASE WHEN I = 3 THEN XNumber ELSE '' END) AS Xnumber3 FROM ( SELECT PRODUCT, XNumber, RANK() OVER(PARTITION BY PRODUCT ORDER BY XNumber) AS I FROM @T ) AS DATA GROUP BY PRODUCT

+0

Спасибо за идею Стивена. Решение от Хогана работало для меня, поэтому я буду двигаться дальше. – Bulbul

Смежные вопросы