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

Откуда:
Сообщений: 3
Добрый день.
Не могу правильно написать условие запроса (в силу ограниченных знание SQL).
Имеется таблица Sale со столбцами:
Visit - номер визита
Code - код блюда
Name - наименование блюда
Date - дата

Условие: необходимо вывести информацию о визите(ах), в котором(ых) есть минимум два определённых блюда (Code=1 and Code=2)

Помогите пожалуйста.
4 апр 16, 16:34    [19015418]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Это если блюда выводить не нужно... просто список визитов:

SELECT Visit, [Date] = MAX([Date])
FROM Sale
GROUP BY Visit
HAVING COUNT(DISTINCT Code) > 1
4 апр 16, 16:41    [19015466]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
idcronus
Member

Откуда:
Сообщений: 3
Как раз нужна полная информация о визите, т.е. все столбцы должны быть в отчете
4 апр 16, 16:43    [19015473]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
iljy
Member

Откуда:
Сообщений: 8711
idcronus
Как раз нужна полная информация о визите, т.е. все столбцы должны быть в отчете


На выбор:

PIVOT
4 апр 16, 16:44    [19015476]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
iljy
Member

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

EXISTS
JOIN
4 апр 16, 16:44    [19015479]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
SELECT *
FROM Sale s1
WHERE EXISTS(
        SELECT *
        FROM Sale s2
        WHERE s1.Visit = s2.Visit
        GROUP BY s2.Visit
        HAVING COUNT(DISTINCT Code) > 1
    )

поскольку индексов Вы не предоставили думаю такого запроса будет достаточно
4 апр 16, 16:46    [19015485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
AlanDenton
SELECT *
FROM Sale s1
WHERE EXISTS(
        SELECT *
        FROM Sale s2
        WHERE s1.Visit = s2.Visit
        GROUP BY s2.Visit
        HAVING COUNT(DISTINCT Code) > 1
    )

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


автор
есть минимум два определённых блюда
4 апр 16, 16:48    [19015496]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
TaPaK, а что Вас смущает? Насколько я помню COUNT(DISTINCT Code) > 1 делает как раз то что нужно.
4 апр 16, 16:50    [19015516]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
AlanDenton
TaPaK, а что Вас смущает? Насколько я помню COUNT(DISTINCT Code) > 1 делает как раз то что нужно.

а что нужно вы прочитать не хотите? или пусть делает то что вам нравится :)
4 апр 16, 16:51    [19015523]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
idcronus
Member

Откуда:
Сообщений: 3
Визит обязательно должен содержать блюда с кодом 1 и 2
4 апр 16, 16:53    [19015529]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Та да... недочитал :)

DECLARE @Sale TABLE (Visit INT, Code INT)

INSERT INTO @Sale (Visit, Code)
VALUES (1, 1), (1, 1), (1, 2)

SELECT *
FROM @Sale s1
WHERE EXISTS(
        SELECT 1
        FROM @Sale s2
        WHERE s1.Visit = s2.Visit
            AND s2.Code IN (1, 2)
        HAVING COUNT(DISTINCT s2.Code) = 2
    )

спасибо за замечание.
4 апр 16, 17:00    [19015565]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
AlanDenton
Та да... недочитал :)

DECLARE @Sale TABLE (Visit INT, Code INT)

INSERT INTO @Sale (Visit, Code)
VALUES (1, 1), (1, 1), (1, 2)

SELECT *
FROM @Sale s1
WHERE EXISTS(
        SELECT 1
        FROM @Sale s2
        WHERE s1.Visit = s2.Visit
            AND s2.Code IN (1, 2)
        HAVING COUNT(DISTINCT s2.Code) = 2
    )

спасибо за замечание.

а если блюдо два раза одно и тоже заказали? или 3+2? :)
4 апр 16, 17:01    [19015572]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Не погодите :) зачем запутывать :)

INSERT INTO @Sale (Visit, Code)
VALUES (1, 1), (1, 1), (1, 2), (2, 1), (2, 1), (2, 4)

все нормально работает
4 апр 16, 17:03    [19015584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
не выспался, отменяется :)
4 апр 16, 17:03    [19015585]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с отчетом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
вообще если так реализовывать, то можно и без EXISTS и HAVING
SELECT *
FROM @Sale s1
WHERE
    (
        SELECT COUNT(DISTINCT s2.Code) 
        FROM @Sale s2
        WHERE s1.Visit = s2.Visit
            AND s2.Code IN (1, 2)    
    ) = 2
4 апр 16, 17:09    [19015631]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить