Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Всем добрый день!

Пытаюсь сделать "форму множественного выбора" для группы записей.

Ниже представлен пример связывающей таблицы типов устройств с идентификаторами
declare @t table (Id int, RefId1 int, RefType int)

INSERT INTO @t (Id, RefId1, RefType)
  select 1, 15, 1
  UNION  
  SELECT 2, 22, 2
  UNION
  SELECT 3, 34, 1
  UNION
  SELECT 4, 22, 1
  UNION 
  SELECT 5, 15, 2

SELECT * FROM @t


Скажем если в группу записей вошли идентификаторы с id равным 15 и 22, то на против типов можно подсвечивать активную галочку.
Если же в группу записей попадут идентификаторы с id 22 и 34, то на против типов нужно подсветить галочки не активными, чтобы обратить внимание пользователя на то что у идентификаторов набор типов не одинаков. Соответсвенно если пользователь делает галочку активной он понимает что пропущенные типы будут добавлены к идентификаторам.

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

у меня ms sql 2008R2
13 янв 16, 11:52    [18671663]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
то на против типов можно подсвечивать активную галочку.

MSSQL не может подсвечивать что-либо

vso
Вопрос в следующем подскажите как сделать запрос чтобы появился признак у записей что галочка должна быть активной или нет.

Так вы сначала внятно сформулируйте критерии, когда и как у записи какой признак вычислять
13 янв 16, 11:56    [18671699]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
vso
как сделать запрос чтобы появился признак у записей что галочка должна быть активной или нет.

Для несовпадающих наборов запрос типа
SELECT 1 
FROM @t 
WHERE RefId1 IN (value1, value2)
GROUP BY RefType
HAVING COUNT(DISTINCT RefId1) <> 2
вернёт непустой набор записей.
13 янв 16, 12:09    [18671793]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
StarikNavy
Member

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

select
...
case cумма_колличества_типов_в_группировке_по_идентификатору* >1 then 1 else 0 end  as ФлагДляПодсветкиВприложении
from


* оконная функция или подзапрос
13 янв 16, 12:28    [18671946]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
StarikNavy
Member

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

cумма_колличества_Уникальных_типов_в_группировке_по_идентификатору
13 янв 16, 12:28    [18671953]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory
vso
то на против типов можно подсвечивать активную галочку.

MSSQL не может подсвечивать что-либо

Так вы сначала внятно сформулируйте критерии, когда и как у записи какой признак вычислять


Я написал, что пытаюсь сделать форму. И хочется получить набор данных на основе которого в приложении уже светить, красить и т.д.1642
13 янв 16, 13:09    [18672236]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
Я написал, что пытаюсь сделать форму.

Я рад за вас. Только какое отношение ваша форма имеет к MSSQL ?

vso
И хочется получить набор данных на основе которого в приложении уже светить, красить и т.д.1642

И вы когда-нибудь покажите, как должен выглядеть этот набор ?
И расскажите, почему он должен выглядеть именно так ?
13 янв 16, 13:12    [18672256]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
StarikNavy
vso,

select
...
case cумма_колличества_типов_в_группировке_по_идентификатору* >1 then 1 else 0 end  as ФлагДляПодсветкиВприложении
from


* оконная функция или подзапрос


что вы имели ввиду под оконной функцией?
13 янв 16, 13:16    [18672277]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
что вы имели ввиду под оконной функцией?

под оконной функцией имееется ввиду оконная функция(window function)
13 янв 16, 13:21    [18672326]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
vso
что вы имели ввиду под оконной функцией?

сто лет уже этого не писал, так что простите, но - вас в гугле забанили?
13 янв 16, 13:22    [18672335]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory
И вы когда-нибудь покажите, как должен выглядеть этот набор ?


К сообщению приложен файл. Размер - 45Kb
13 янв 16, 13:47    [18672550]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
Glory
И вы когда-нибудь покажите, как должен выглядеть этот набор ?


Картинка с другого сайта.

Крутые картинки ! Сами рисовали ?
И какое отношение к этим картинкам имеет набор данных, которые должен сформировать запрос ?
13 янв 16, 13:50    [18672572]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Mairos
Member

Откуда:
Сообщений: 555
vso, честно говоря, как-то мутно вы формулируете задачу. И, как справедливо было уже замечено, построение форм в клиентской части делается, а не в среде сервера (базы данных). Объясните наконец толком, что вы хотите получить? Не про "формы" и "галочки" в них, а про набор данных и условия выборки, которые от вас требуют. Извините..
13 янв 16, 13:59    [18672654]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory,

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

Программа анализирует выделенные записи и передает их id в процедуру. Процедура на основе переданных данных формирует нобор данных который отображается в "форме множественного выбора".

вот собственно сама процедура:
CREATE PROCEDURE dbo.spSelectUsedBox
  @Table ListId READONLY
AS

 SELECT Name,
         CASE WHEN Q.cnt > 1 THEN 2 ELSE ISNULL(Q.cnt, 0) END AS cnt,
         TypeBoxes.BoxID
  FROM dbo.TypeBoxes
    LEFT OUTER JOIN (SELECT COUNT(TypeBoxes.Name) AS cnt,
                            TypeBoxes.BoxID,
                            TypeBoxes.ID
    FROM dbo.vListRefBox
      INNER JOIN dbo.TypeBoxes ON vListRefBox.RefTypeBox = TypeBoxes.ID
      INNER JOIN @Table t ON t.ID = RefId
    GROUP BY TypeBoxes.Name,
             TypeBoxes.BoxID,
             TypeBoxes.ID) Q ON TypeBoxes.ID = Q.ID
13 янв 16, 14:03    [18672676]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
vso,

вопрос в чем? Вы хотите проблемы интерфейса приложения решить на форуме, обсуждающем MS SQL? Участники не в курсе , как сделать галочку активной на вашей форме.
13 янв 16, 16:34    [18673674]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Владислав Колосов,

я спрашивал не о отм как галочку подсветить, а о том как на основе имеющихся данных сформировать набор данных опираясь на которые приложение все раскрасит, спросит пользователя если нужно...
13 янв 16, 17:10    [18673963]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
пока получилось следующая процедура, потестировал вроде работает как надо, попробую на ее основе сделать форму:

CREATE PROCEDURE dbo.spSelectUsedBox
  @Table ListId READONLY
AS
  DECLARE @max int;
  
  SELECT @max = MAX(lrb.cnt)
  FROM dbo.vListRefBox lrb
    INNER JOIN @Table T ON lrb.RefId = T.Id; 

  SELECT DISTINCT tb.Name,
                  tb.BoxID,
                  ISNULL(Q.flag, 0) AS flag
  FROM dbo.TypeBoxes tb
    LEFT OUTER JOIN (SELECT DISTINCT lrb.RefTypeBox,
                                     CASE
                                       WHEN MIN(lrb.cnt) OVER (PARTITION BY lrb.RefTypeBox) < @max THEN 2
                                       ELSE 1
                                     END AS flag
                     FROM dbo.vListRefBox lrb
  INNER JOIN @Table T ON lrb.RefId = T.id) AS Q ON Q.RefTypeBox = tb.ID;


StarikNavy и Glory, спасибо ваша подсказка про оконные функции пригодилась. Если кто увидит более лучшее решения, то буду очень признателен.
13 янв 16, 17:14    [18674001]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8807
vso,

а почему пары 15 - 22 , 22 - 34, чем они отличаются от 10-15 и 18-40? Вы сообщаете 10% информации и хотите получить внятный ответ.
13 янв 16, 17:23    [18674070]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Владислав Колосов,

согласен мой косяк :(

Дело в том что у пары 15 и 22 по два типа => они эдентичны, а у пары 22 и 34 не раное кол-во типов.
13 янв 16, 17:32    [18674140]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
одинаковое кол-во типов и тех же самых видов типов
13 янв 16, 17:33    [18674151]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
Glory
Member

Откуда:
Сообщений: 104751
vso
одинаковое кол-во типов и тех же самых видов типов

А вы сообщите когда-нибудь, какое поле в вашей таблице есть "тип", а какое "вид типа" ?

vso
Дело в том что у пары 15 и 22 по два типа => они эдентичны, а у пары 22 и 34 не раное кол-во типов.

Что такое "пара" ? Почему вдруг два произвольных числа начинают образовывать какую-то пару ?
13 янв 16, 17:48    [18674222]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
aleks2
Guest
vso
пока получилось следующая процедура, потестировал вроде работает как надо, попробую на ее основе сделать форму:

CREATE PROCEDURE dbo.spSelectUsedBox
  @Table ListId READONLY
AS
  DECLARE @max int;
  
  SELECT @max = MAX(lrb.cnt)
  FROM dbo.vListRefBox lrb
    INNER JOIN @Table T ON lrb.RefId = T.Id; 

  SELECT DISTINCT tb.Name,
                  tb.BoxID,
                  ISNULL(Q.flag, 0) AS flag
  FROM dbo.TypeBoxes tb
    LEFT OUTER JOIN (SELECT DISTINCT lrb.RefTypeBox,
                                     CASE
                                       WHEN MIN(lrb.cnt) OVER (PARTITION BY lrb.RefTypeBox) < @max THEN 2
                                       ELSE 1
                                     END AS flag
                     FROM dbo.vListRefBox lrb
  INNER JOIN @Table T ON lrb.RefId = T.id) AS Q ON Q.RefTypeBox = tb.ID;


StarikNavy и Glory, спасибо ваша подсказка про оконные функции пригодилась. Если кто увидит более лучшее решения, то буду очень признателен.


Даже если не задумываться о смысле этого бреда - это
  SELECT @max = MAX(lrb.cnt)
  FROM dbo.vListRefBox lrb
    INNER JOIN @Table T ON lrb.RefId = T.Id; 

и это
SELECT DISTINCT lrb.RefTypeBox,
                                     CASE
                                       WHEN MIN(lrb.cnt) OVER (PARTITION BY lrb.RefTypeBox) < @max THEN 2
                                       ELSE 1
                                     END AS flag
                     FROM dbo.vListRefBox lrb

можно выполнить за ОДИН раз.
Облегчив участь сервера.
13 янв 16, 17:54    [18674256]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
mishanya3624
Member

Откуда:
Сообщений: 796
aleks2,

+1
13 янв 16, 17:56    [18674271]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
Glory
vso
одинаковое кол-во типов и тех же самых видов типов

А вы сообщите когда-нибудь, какое поле в вашей таблице есть "тип", а какое "вид типа" ?


Поле отвечающее за тип RefType, под видом типа я имел ввиду значение и что помимо того что проверяем на одинаковое кол-во чвязанное с RefId. так еще и одинаковые значения.

Glory
vso
Дело в том что у пары 15 и 22 по два типа => они эдентичны, а у пары 22 и 34 не раное кол-во типов.

Что такое "пара" ? Почему вдруг два произвольных числа начинают образовывать какую-то пару ?


Я специально акцентировал внимание что это пример, и то что взята пара это гипотетическая ситуация, может быть и больше. А зависит это как раз от кол-ва выделенных записей, опять же, которые как пример я показал на картинке и id которых потом передается в процедуру.
13 янв 16, 22:02    [18675122]     Ответить | Цитировать Сообщить модератору
 Re: Как опредилить одинаковость набора  [new]
vso
Member

Откуда: СПб
Сообщений: 270
aleks2,

было бы неплохо посмотреть как этот бред превращается в нечто особенное и легкое для сервера в руках мастера!
13 янв 16, 22:04    [18675132]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить