2015-12-02 2 views
0

Я пытаюсь выбрать отдельные даты бронирования по количеству дат бронирования для каждой даты. Мне нужно сравнить лицензионный ключ от таблицы reservation date до LicenseKeyTB.T-SQL: выбор нескольких столбцов с отличным значением

Это то, что я до сих пор:

SELECT 
    l.LicenseKey, 
    numOfReservation 
FROM 
    RX.LicenseKeyTB l 
    JOIN (
    SELECT 
     r.LicenseKey, 
     DISTINCT r.ReservationDate, 
     COUNT(r.ReservationDate) 
     OVER (PARTITION BY r.ReservationDate ORDER BY r.LicenseKey) as numOfRes 
    FROM 
     RX.ReservationTB r 
) AS ReservatonDateCount 
    ON ReservatonDateCount.LicenseKey = l.LicenseKey; 

sql diagram

Я получаю следующее сообщение об ошибке:

Column 'RX.ReservationTB.LicenseKey' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

EDIT ----------- ---

Извините, я не дал изображения полностью. Я пытаюсь проверить, доступен ли лицензионный ключ для определенного диапазона дат. Для диапазона дат я не могу пережить количество всех мест, которые у меня есть для лицензионного ключа s. Для Office 2010 есть лицензионный ключ, а для Office 2013 есть еще один. Для обоих лицензионных ключей имеется общее количество мест. Я не могу пройти через множество мест. например Я не могу сразу получить 5 лицензий Office 2010 и 8 Office 2013, но у меня могут быть 4 и 6.

Мне нужно запросить лицензионный ключ для продукта (например, Office 2010), где общее количество резервирований для диапазон дат не превышает количество доступных мест для обоих лицензионных ключей.

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

complete sql diagram

Нарушение этого до:

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

-- number of reservations per day for a license key 
SELECT 
    l.LicenseKey, 
    l.ReservationDate, 
    COUNT(1) AS numOfReservation 
FROM RX.ReservationTB l 
WHERE l.LicenseKey = '6RCX3-H722D-8MQT6-8Y2VC-FY9FG' 
AND CONVERT(date, '20151130')<=l.ReservationDate 
AND l.ReservationDate<CONVERT(date, '20151205') 
GROUP BY l.LicenseKey, l.ReservationDate 
ORDER BY l.LicenseKey, l.ReservationDate 

- Мне не нужен список лицензионных ключей продукта, доступных для данного диапазона дат.

....

Вот что я до сих пор:

SELECT 
    p.Name, 
    s.SeatsTotal, 
    COUNT(1) AS numOfReservation 
    FROM RX.ProductTB p 
     JOIN RX.LicenseKeyTB l ON p.ProductID=l.LicenseKey 
     JOIN RX.SeatsAvailableTB s ON l.SeatID=s.SeatID 
     JOIN RX.ReservationTB r ON r.LicenseKey=l.LicenseKey 
      WHERE CONVERT(date, '20151130')<=r.ReservationDate 
       AND r.ReservationDate<CONVERT(date, '20151205') 
    GROUP BY p.Name, s.SeatsTotal 

Я получаю сообщение об ошибке:

Msg 245, Level 16, State 1, Line 1 
Conversion failed when converting the nvarchar value '6RCX3-H722D-8MQT6-8Y2VC-FY9FG' to data type int. 
+1

'DISTINCT' только когда-либо применяется к ** всей строке ** - вы не можете получить« отличные »значения столбцов. Синтаксис: 'SELECT DISTINCT (список столбцов)' (ключевое слово 'DISTINCT' не может находиться в середине списка столбцов) –

+0

Можете ли вы предоставить образцы данных и желаемые результаты? В дополнение к неправильному использованию 'distinct', вы отправили сообщение об ошибке, потому что вы не можете использовать' order by' в разделе 'partition' при использовании' count' - ничего не заказывать со счетом ... – sgeddes

+0

'DISTINCT' не является классификатором для столбцов, это модификатор для 'SELECT'. Вы либо «SELECT DISTINCT», либо просто «SELECT» [не обязательно разные]. –

ответ

1

Не совсем уверен, что вы пытаетесь сделать здесь но, возможно, это так просто?

SELECT r.LicenseKey 
    , r.ReservationDate 
    , COUNT(r.ReservationDate) as numOfRes 
FROM RX.ReservationTB r 
group by r.LicenseKey 
    , r.ReservationDate 
0

Я думаю, что вы просто хотите count(distinct):

SELECT r.LicenseKey, 
     COUNT(DISTINCT r.ReserationDate) as numOfReservation 
FROM RX.ReservationTB l 
GROUP BY r.LicenseKey; 

Обратите внимание, что объединение не является необходимым, поскольку LicenseKey в таблице оговорок и, как представляется, является внешним ключом ссылкой на LicenseTB.

+0

Хм. Я бы купил «соединение не нужно, потому что« ReservationTB.LicenseKey »- это внешний ключ, ссылающийся на таблицу ключей лицензии». Однако, если не для отношений FK, соединение будет использоваться для фильтрации строк, где зарезервированный лицензионный ключ отсутствует в таблице ключей лицензии. Конечно, данное соединение было бы невозможно вообще, если «LicenseKey» не было в таблице бронирования. –

+0

@JohnBollinger. , , Это стоит сделать явным, поэтому я и сделал. –

0

Некоторые вопросы о том, что вы пытаетесь сделать, но если я останусь с 2 колонками вы выбирающие в вашем примере я получаю:

SELECT 
    l.LicenseKey, 
    COUNT(1) AS numOfReservation, 
    COUNT(DISTINCT l.ReservationDate) AS DaysLicenseUsed 
FROM RX.ReservationTB l 
GROUP BY l.LicenseKey 
ORDER BY l.LicenseKey 

Если вы пытаетесь получить ряд оговорок в день для каждой лицензии это будет:

SELECT 
    l.LicenseKey, 
    l.ReservationDate, 
    COUNT(1) AS numOfReservation, 
FROM RX.ReservationTB l 
GROUP BY l.LicenseKey, l.ReservationDate 
ORDER BY l.LicenseKey, l.ReservationDate