T-SQL:选择具有不同值

时间:2015-12-02 22:03:19

标签: sql sql-server tsql

我正在尝试为每个日期的预订日期数量选择不同的预订日期。我需要将reservation date表中的许可证密钥与LicenseKeyTB进行比较。

这是我到目前为止所做的:

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

我收到以下错误:

  

列' RX.ReservationTB.LicenseKey'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

编辑--------------

对不起,我没有全面了解情况。我想要做的是检查许可证密钥是否可用于特定日期范围。对于日期范围,我不能超过许可证密钥 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.

3 个答案:

答案 0 :(得分:1)

不确定你在这里想做什么,但也许就这么简单?

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

答案 1 :(得分:0)

我认为你只想要count(distinct)

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

请注意,联接不是必需的,因为LicenseKey位于预订表中,并且似乎是LicenseTB的外键引用。

答案 2 :(得分: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