2014-10-30 8 views
-1
собственника Отдельный

я в настоящее время это утверждение ...SQL Server: Группа INNER JOIN в Колонном

SELECT * 
FROM stock AS s 
INNER JOIN stock_attributes AS sa ON sa.stock_code = s.stock_code 

Это выводит информацию, как это ...

| stock_code | attribute name | attribute value | 
|------------|----------------|-----------------| 
| ABC01 |  color  |  red  | 
| ABC01 |  size  |  small  | 
| ABC01 |  price  |  10.0  | 
| XYZ99 |  color  |  blue  | 
| XYZ99 |  size  |  large  | 
| XYZ99 |  price  |  50.0  | 

Однако я хочу, чтобы выглядеть следующим образом

| stock_code |  color  |  size  |  price  | 
|------------|----------------|-----------------|------------------| 
| ABC01 |  red  |  small  |  10.0  | 
| XYZ99 |  blue  |  large  |  50.0  | 

Я нашел много примеров этого на SO, но они кажутся чрезвычайно точными со сложными примерами и была уверена, что функция будет существовать для того, чего я пытаюсь достичь выше.

В настоящее время я достигаю этого с несколькими INNER JOIN s с SELECT в каждом из них, чтобы выбрать имена атрибутов, однако это необходимо вручную изменить, когда создаются новые имена атрибутов.

Большое спасибо заранее!

+0

Вот почему таблицы атрибутов - плохая идея, их сложно запросить. То, что вам действительно нужно сделать, - это правильно отредактировать вашу базу данных. Таблицы EAV предназначены только для вещей, которые вы не можете процитировать во время деагининга, и если вам нужно много информации в них, вы не должны использовать реальную базу данных вообще. Их не только сложно запросить, они могут быть убийцами производительности. – HLGEM

+1

Посмотрите на google: сводные таблицы. –

+0

* однако это требует внесения изменений вручную при создании новых имен атрибутов * Не так много можно сделать. Это одна из затрат на дизайн атрибутов Entity Attribute. Вам нужно будет либо выполнять динамические запросы, либо генерировать код при добавлении атрибута –

ответ

0

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

CREATE VIEW STOCK_COLOURS AS SELECT STOCK_CODE, STOCK_VALUE FROM STOCK_ATTRIBUTES WHERE ATTRIBUTE_NAME = 'colour '

Создать один из них для каждого атрибута, Вам нужно зарегистрироваться в главном запросе.

+0

Это выглядит хорошо, как бы у меня был такой же ответ, чтобы показать столбец 'colour' и колонку 'size', хотя? –

+0

Создайте еще один вид под названием 'STOCK_SIZES', другой называется' STOCK_PRICES' и т. Д. ... –

1

СЛУЧАЯ агрегация на основе может быть использована для шарнирного

SELECT stock_code, 
      MAX(case when attribute name='color' then attributevalue end) as color, 
      MAX(case when attribute name='size' then attributevalue end) as size, 
      MAX(case when attribute name='price' then attributevalue end) as price 
    FROM Table1 
    GROUP BY stock_code 
1

ИТАК не полностью отвечает вопрос, как мне нужно, чтобы определить имена, однако им использовать это ... (который имеет только один оператор выбора)

SELECT * FROM (
    SELECT * 
    FROM stock AS s 
    INNER JOIN stock_attributes AS sa ON sa.stock_code = s.stock_code 
) AS MyData 
PIVOT(
    MAX(attibute_value) 
    FOR attribute_name IN ("Color", "Size", "Price") 
) AS MyPivotData 
+1

+1, это правильно. теперь, если вы не знаете все возможные значения, вам нужно использовать динамический sql для его создания. вот пример. http://stackoverflow.com/questions/26262720/sql-how-to-do-a-pivot-of-one-column-regardless-of-the-data/26262804#26262804 – radar