Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
имеется таблица со 124 колонками,
требуется вывести эту таблицу (все строки),
исключив колонки, где кроме значений 0 других нет.
все столбцы
money, not null

вроде как динамика неизбежна,
но как оптимальнее сделать?
первое, что пришло в голову,
посчитать итоговую сумму по каждому столбцу и сформировать таблицу
только из столбцов, где сумма <> 0,
но не катит, т.к. в столбце может быть пара противоположных значений
(типа 10 и -10), тогда хоть сумма и 0, но столбец надо вывести.
поделитесь идеями, плиз!
9 ноя 12, 15:26    [13447084]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ups_ops,

HAVING COUNT(ИмяПоля)<>COUNT(*)
9 ноя 12, 15:29    [13447112]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
е р ов т
Guest
считайте сумму не по значению а по его квадрату
9 ноя 12, 15:30    [13447125]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
iap
ups_ops,

HAVING COUNT(ИмяПоля)<>COUNT(*)
Пардон, у Вас же 0, а не NULL
HAVING COUNT(NULLIF(ИмяПоля,0))<>COUNT(*)
9 ноя 12, 15:30    [13447126]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
нипонял.
все столбцы NOT NULL.
условие
HAVING COUNT(ИмяПоля)<>COUNT(*)
верно всегда, даже для столбца, состоящего целиком из 0.
а его такого 0-ого выводить не надо
9 ноя 12, 15:33    [13447151]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
е р ов т
считайте сумму не по значению а по его квадрату

прикольная идея.
но там суммы хорошие, да.
поди, сумма из money вылезет.
щас проверим
9 ноя 12, 15:35    [13447176]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ups_ops
нипонял.
все столбцы NOT NULL.
условие
HAVING COUNT(ИмяПоля)<>COUNT(*)
верно всегда, даже для столбца, состоящего целиком из 0.
а его такого 0-ого выводить не надо
Писатель, да?
Я ж поправился давно!
9 ноя 12, 15:35    [13447181]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
в смысле, сумма квадратов будет офигительная
9 ноя 12, 15:36    [13447193]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
iap
ups_ops
нипонял.
все столбцы NOT NULL.
условие
HAVING COUNT(ИмяПоля)<>COUNT(*)
верно всегда, даже для столбца, состоящего целиком из 0.
а его такого 0-ого выводить не надо
Писатель, да?
Я ж поправился давно!


чо, в сортир нельзя отлучиться?
или надо комп таскать с собой покакать?
9 ноя 12, 15:37    [13447215]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Можно ещё и так:
SUM(CASE Field WHEN 0 THEN 1 ELSE 0 END)
Или так:
NOT EXISTS(SELECT * FROM T WHERE Field=0)
И ещё 100500 способов!
Кстати, даже версию не сказали
9 ноя 12, 15:38    [13447221]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
да всегда пожалуйста:
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)   Jun 17 2011 00:54:03   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) (Hypervisor) 
9 ноя 12, 15:40    [13447239]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ups_ops
Guest
спасибо, заюзаю
NOT EXISTS(SELECT * FROM T WHERE Field=0)
9 ноя 12, 15:44    [13447280]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ups_ops
да всегда пожалуйста:
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)   Jun 17 2011 00:54:03   Copyright (c) Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2) (Hypervisor) 
Значит, ещё INTERSECT или EXCEPT воткнуть можно

Кстати, если определять максимум ABS(Field), он будет равен 0, если всё равно 0
Или WHERE (SELECT TOP(1) Field ORDER BY ABS(Field) DESC)<>0

И ещё 100500 способов
9 ноя 12, 15:46    [13447297]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ups_ops
спасибо, заюзаю
NOT EXISTS(SELECT * FROM T WHERE Field=0)
Я, кажется, =0 написал, а надо <>0. Но это технические мелочи, так ведь?
9 ноя 12, 15:48    [13447322]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
ыв ав ывп вп
Guest
если числа большие и это смущает, то
select sum(square(sign(YOUR_POLE_money))) from YOUR_table 

выдаст ноль, только если все сторки нулевые.
9 ноя 12, 15:49    [13447335]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
вава п
Guest
iap,

подскажите, на сколько порядков добавление вычислений тормозит такого рода запросы
9 ноя 12, 15:51    [13447348]     Ответить | Цитировать Сообщить модератору
 Re: выбрать только столбцы, где имеется ненулевое значение  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
ыв ав ывп вп
если числа большие и это смущает, то
select sum(square(sign(YOUR_POLE_money))) from YOUR_table 

выдаст ноль, только если все сторки нулевые.
Всё-таки, ABS() надёжнее и точнее, чем SQUARE()
9 ноя 12, 15:51    [13447355]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить