Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поле типа Bit и GROUP BY  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7899
Есть главная таблица содержащая поле типа Bit и есть подчиненная к ней таблица, содержащая некоторые числовые данные.

Мне необходимо для одной конкретной записи из главной таблицы получить сумму из подчиненной таблицы, но чтобы при этом было отображено значение поля типа Bit из главной.

Т.е. если бы речь шла об обычных полях, то запрос бы выглядел так:


SELECT tab1.tabID, tab1.Field1, SUM(tab2.Field2)
FROM tab1 LEFT JOIN tab2 ON tab1.tabID=tab2.tabID
WHERE tab1.tabID=@MyValue
GROUP BY tab1.tabID, tab1.Field1


А вот как добиться того же самого, если Field1 - это поле типа Bit?

У меня SQLS7+SP4
5 авг 02, 17:04    [43726]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
SELECT tab1.tabID, CAST(tab1.Field1 as tyneint) , SUM(tab2.Field2) 

FROM tab1 LEFT JOIN tab2 ON tab1.tabID=tab2.tabID
WHERE tab1.tabID=@MyValue
GROUP BY tab1.tabID, CAST(tab1.Field1 as tyneint)
5 авг 02, 17:07    [43728]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7899
Это, конечно, вариант. Проблема только в том, что мне он нужен именно как Bit.

Дело в том, что в качестве клиента у меня FoxPro, который автоматически конвертирует тип Bit в свой тип Logical. А числовые он воспримет как числовые, что несколько не то, что нужно.

В принципе, я конечно могу вместо Bit использовать TyneInt. Изменения будут минимальные. Стоит ли произвести такую замену?
5 авг 02, 17:25    [43732]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
если поле одно то можно глобально поменять на tynrint...
а можно и так....
SELECT t.tabID, cast(t.Field1 as bit) as fileld1, t.sum_field2

FROM (SELECT tab1.tabID, tab1.Field1, SUM(tab2.Field2) as sum_field2
FROM tab1 LEFT JOIN tab2 ON tab1.tabID=tab2.tabID
WHERE tab1.tabID=@MyValue
GROUP BY tab1.tabID, tab1.Field1) as t
5 авг 02, 17:38    [43741]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
А так нельзя
case when then 'TRUE'
Или я что-то напутал
5 авг 02, 17:48    [43746]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
1. по case не сгруппируш....
2. на выходе обратная конвертация с использованием cast должна быть быстрее....
5 авг 02, 17:52    [43749]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7899
Мда, видимо дешевле вообще отказаться от использования типа BIT, особенно если требуется какая-то аналитика с группировкой по таким полям.

Ладно, буду менять на Tinyint.
5 авг 02, 17:55    [43754]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
если поле одно или не существенн прирост баз... то конвертация...
если битовых полей несколько - то все равно быстрее обрабатывать и хранить их в интегральных значениях ...
если например в таблице нужно хранить 4 логических значения - можно впихнуть все в tyneint...
а пользовать нужные с логической выборкой....
появляются некоторые плюсы...
5 авг 02, 18:01    [43756]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
PeterG
Member

Откуда:
Сообщений: 39
2Mice:
Почему же по CASE не сгруппируешь? Очень даже:

SELECT type = case
WHEN type = 'T' then 'TABLE'
WHEN type = 'P' then 'PROCEDURE'
ELSE 'OTHER'
end,
COUNT(*)
FROM sysobjects
GROUP BY case
WHEN type = 'T' then 'TABLE'
WHEN type = 'P' then 'PROCEDURE'
ELSE 'OTHER'
end
5 авг 02, 19:44    [43787]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
хм... и действительно.... век живи - век учись.... ;)
да кста... а так не подет?
SELECT tab1.tabID, tab1.Field1 , SUM(tab2.Field2) ,CAST(tab1.Field1 as tyneint)

FROM tab1 LEFT JOIN tab2 ON tab1.tabID=tab2.tabID
WHERE tab1.tabID=@MyValue
GROUP BY tab1.tabID, CAST(tab1.Field1 as tyneint)
5 авг 02, 19:58    [43794]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
VVG_
Member

Откуда: Санкт-Петербург
Сообщений: 1203
Можно держать все в tinyint, а фоксу подсовывать вьюху, где написать cast ... as bit
5 авг 02, 20:02    [43795]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
Сергей Тихонов
Member

Откуда: Киев
Сообщений: 787
Группировка по битовым полям (а также индексирование) доступны в MSSQL 2000.
5 авг 02, 20:07    [43797]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7899
MiCe
Последний вариант не пройдет по определению. Не может быть в запросе поле без функции аггрегирования, если оно не включено в перечень полей группировки. Такое только в FoxPro возможно :)

VVG_
Можно. Но это значит "искать приключений на свою голову". Тем более это не решает поставленного вопроса

Сергей Тихонов
Это радует, но у меня MS SQL7

ALL
Спасибо всем. Я преобразовал поле типа BIT в поле типа TINYINT.
6 авг 02, 11:53    [43936]     Ответить | Цитировать Сообщить модератору
 Re: Поле типа Bit и GROUP BY  [new]
negresse
Member

Откуда:
Сообщений: 1
может, кому-то поможет
хотя и поздно

SELECT tab1.tabID, tab3.Field2 Field1, SUM(tab2.Field2)
FROM
tab1 LEFT JOIN tab2 ON tab1.tabID=tab2.tabID
JOIN (select cast(a.Field1 as Integer) Field2, a.tabID from tab1 a) tab3 ON tab3.tabID_ID = tab1.tabID
WHERE tab1.tabID=@MyValue
GROUP BY tab1.tabID, tab3.Field2
3 июл 03, 12:10    [249885]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Поле типа Bit и GROUP BY  [new]
sergeyleroy
Member

Откуда:
Сообщений: 8
MiCe
SELECT tab1.tabID, CAST(tab1.Field1 as tyneint) , SUM(tab2.Field2)
FROM tab1 LEFT JOIN tab2 ON tab1.tabID=tab2.tabID
WHERE tab1.tabID=@MyValue
GROUP BY tab1.tabID, CAST(tab1.Field1 as tyneint)


Спасибо!
14 дек 11, 14:35    [11764404]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить