Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Вопрос-Ответ Новый топик    Ответить
 Создать полную структуру  [new]
traregs
Member

Откуда:
Сообщений: 15
Предположим у меня есть таблица:
A B C
---------
A1 B1 3
A1 B2 500
A2 B3 343
A3 B1 33
A3 B2 50
A3 B3 34

А надо, чтобы получилось:
A B C
---------
A1 B1 3
A1 B2 500
A1 B3 0
A1 B4 0
A2 B1 0
A2 B2 0
A2 B3 343
A2 B4 0
A3 B1 33
A3 B2 50
A3 B3 34
A3 B4 0

то есть, для _каждого_ значения в столбце A - должны быть _все_ варианты B, причём даже те, которые не встречаются в оригинале (просто полный набор, представленный списком констант: 'B1','B2','B3','B4')

Как сделать столбец из констант - придумал, но явно очень неоптимально. А вот как сделать чёткую структуру - не сообразил.
30 янв 17, 12:44    [20161047]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20772
Получится чёнить вроде
SELECT ta.a, tb.b, COALESCE(tc.c, 0) c
FROM ( (SELECT a FROM table) ta
     , (SELECT и FROM table) tb
     )
     LEFT JOIN table tc ON tc.a = ta.a AND tc.b = tb.b
30 янв 17, 12:50    [20161106]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
traregs
Member

Откуда:
Сообщений: 15
Akina
Получится чёнить вроде
SELECT ta.a, tb.b, COALESCE(tc.c, 0) c
FROM ( (SELECT a FROM table) ta
     , (SELECT и FROM table) tb
     )
     LEFT JOIN table tc ON tc.a = ta.a AND tc.b = tb.b

Что-то оно не получается, только мозг греется
30 янв 17, 13:38    [20161544]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20772
mysql> create table test (
    -> a varchar(2),
    -> b varchar(2),
    -> c int
    -> );
Query OK, 0 rows affected (0.37 sec)

mysql> insert into test (a,b,c)
    -> select 'A1','B1',3   union all
    -> select 'A1','B2',500 union all
    -> select 'A2','B3',343 union all
    -> select 'A3','B1',33  union all
    -> select 'A3','B2',50  union all
    -> select 'A3','B3',34  ;
Query OK, 6 rows affected (0.09 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from test;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| A1   | B1   |    3 |
| A1   | B2   |  500 |
| A2   | B3   |  343 |
| A3   | B1   |   33 |
| A3   | B2   |   50 |
| A3   | B3   |   34 |
+------+------+------+
6 rows in set (0.00 sec)

mysql> SELECT ta.a, tb.b, COALESCE(tc.c, 0) c
    -> FROM ( (SELECT DISTINCT a FROM test) ta
    ->      , (SELECT DISTINCT b FROM test) tb
    ->      )
    ->      LEFT JOIN test tc ON tc.a = ta.a AND tc.b = tb.b
    -> ORDER BY 1,2;
+------+------+------+
| a    | b    | c    |
+------+------+------+
| A1   | B1   |    3 |
| A1   | B2   |  500 |
| A1   | B3   |    0 |
| A2   | B1   |    0 |
| A2   | B2   |    0 |
| A2   | B3   |  343 |
| A3   | B1   |   33 |
| A3   | B2   |   50 |
| A3   | B3   |   34 |
+------+------+------+
9 rows in set (0.00 sec)

mysql> SELECT ta.a, tb.b, COALESCE(tc.c, 0) c
    -> FROM ( (SELECT DISTINCT a FROM test) ta
    ->      , (SELECT 'B1' b UNION ALL
    ->         SELECT 'B2'   UNION ALL
    ->         SELECT 'B3'   UNION ALL
    ->         SELECT 'B4'
    ->        ) tb
    ->      )
    ->      LEFT JOIN test tc ON tc.a = ta.a AND tc.b = tb.b
    -> ORDER BY 1,2;
+------+----+------+
| a    | b  | c    |
+------+----+------+
| A1   | B1 |    3 |
| A1   | B2 |  500 |
| A1   | B3 |    0 |
| A1   | B4 |    0 |
| A2   | B1 |    0 |
| A2   | B2 |    0 |
| A2   | B3 |  343 |
| A2   | B4 |    0 |
| A3   | B1 |   33 |
| A3   | B2 |   50 |
| A3   | B3 |   34 |
| A3   | B4 |    0 |
+------+----+------+
12 rows in set (0.00 sec)
30 янв 17, 13:53    [20161710]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
traregs
Member

Откуда:
Сообщений: 15
Akina
mysql> create table test (
    -> a varchar(2),
...
+------+----+------+
12 rows in set (0.00 sec)


Наверное, дело в разнице MySQL и MS SQL (2012)

SELECT * [test]

a b c
A1 B1 3
A1 B2 500
A2 B3 343
A3 B1 33
A3 B2 50
A3 B3 34


1>SELECT ta.a, tb.b, COALESCE(tc.c, 0) c
2>FROM ( (SELECT DISTINCT a FROM test) ta
3> , (SELECT 'B1' b UNION ALL
4> SELECT 'B2' UNION ALL
5> SELECT 'B3' UNION ALL
6> SELECT 'B4'
7> ) tb
8> )
9> LEFT JOIN test tc ON tc.a = ta.a AND tc.b = tb.b
10>ORDER BY 1,2;

Сообщение 102, уровень 15, состояние 1, строка 3
Неправильный синтаксис около конструкции ",".
Сообщение 102, уровень 15, состояние 1, строка 7
Неправильный синтаксис около конструкции "tb".
30 янв 17, 14:07    [20161851]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
traregs
Member

Откуда:
Сообщений: 15
И, кстати, я надеялся, что есть способ сделать столбец из набора констант, попроще, чем:
traregs
3> , (SELECT 'B1' b UNION ALL
4> SELECT 'B2' UNION ALL
5> SELECT 'B3' UNION ALL
6> SELECT 'B4'
7> ) tb
30 янв 17, 14:09    [20161881]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20772
traregs
Наверное, дело в разнице MySQL и MS SQL (2012)
А выбрать правильный раздел не судьба была?

traregs
я надеялся, что есть способ сделать столбец из набора констант, попроще
Куда уж ещё проще-то...
30 янв 17, 14:20    [20161959]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
traregs
Member

Откуда:
Сообщений: 15
Akina
traregs
Наверное, дело в разнице MySQL и MS SQL (2012)
А выбрать правильный раздел не судьба была?

Странно, вроде в "Все форумы / Вопрос-Ответ" - нигде не сказано про MySQL
30 янв 17, 14:23    [20161985]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20772
Поэтому и получен ОТВЕТ. Он работает. А что не везде - так то и есть следствие неправильного выбора раздела.
30 янв 17, 15:16    [20162317]     Ответить | Цитировать Сообщить модератору
 Re: Создать полную структуру  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20772
Можно было получить вообще какую-нить хрень типа
SELECT ta.a AS a, tb.b AS b, COALESCE(tc.c, 0) AS c
FROM      (SELECT a FROM test GROUP BY a) AS ta
LEFT JOIN (SELECT 'B1' AS b UNION ALL
           SELECT 'B2'      UNION ALL
           SELECT 'B3'      UNION ALL
           SELECT 'B4'
          ) AS tb ON (ta.a + tb.b > 0)
LEFT JOIN test AS tc ON tc.a = ta.a AND tc.b = tb.b
ORDER BY 1,2;

Вроде бы бред, но зато работать должно практически везде...
30 янв 17, 15:22    [20162341]     Ответить | Цитировать Сообщить модератору
Все форумы / Вопрос-Ответ Ответить