CFChart выдает ошибку 500
Я пытаюсь создать диаграмму с запросом запросов, но получаю ошибку 500 независимо от того, что я пытаюсь. В итоге я нашел тег cfchart как проблему, но не смог найти ни синтаксических ошибок, ни логических ошибок.
<cfquery name="getData" datasource="#dsn#">
SELECT
( SELECT Count(UserID)
FROM Users
WHERE StripeCustomerID IS NOT NULL
) AS 'Licenses'
, COUNT(UserID) AS 'Registrations'
, UserID AS 'User'
FROM Users
WHERE DATEDIFF(hour, FirstContact, DateStamp) <= '12'
GROUP BY UserID
</cfquery>
<cfquery name="queryOfQuery" dbtype="query">
SELECT (Licenses/Registrations) AS Percent FROM getData
</cfquery>
<cfchart format="flash">
<cfchartseries type="bar"
query="queryOfQuery"
itemcolumn="UserID"
valuecolumn="Percent" />
</cfchart>
Пример данных
Users Table Sample Data
UserID StripeCustomerID
35 cus_8LOSlmvEQcfg1g
36 cus_6ixCBe7aU1MJEt
50 NULL
60 cus_6ifLCNmR9rOBCl
69 NULL
70 NULL
72 NULL
73 NULL
74 NULL
1 ответ
Ваша проблема с синтаксисом
SELECT (Licenses/Registrations) AS Percent FROM getData
Percent является зарезервированным ключевым словом, поэтому вам нужно добавить скобки или одинарные кавычки, чтобы механизм SQL знал, что вы используете зарезервированное ключевое слово в качестве псевдонима столбца.
SELECT (Licenses/Registrations) AS [Percent] FROM getData
ИЛИ ЖЕ
SELECT (Licenses/Registrations) AS 'Percent' FROM getData
Вы можете легко добавить колонку процентов к исходному набору данных.
SELECT
(SELECT Count(UserID) FROM Users WHERE StripeCustomerID IS NOT NULL) AS Licenses,
COUNT(UserID) AS Registrations,
(SELECT Count(UserID) FROM Users WHERE StripeCustomerID IS NOT NULL) / COUNT(UserID) AS [Percent],
UserID AS User
FROM Users
WHERE DATEDIFF(hour, FirstContact, DateStamp) <= '12'
GROUP BY UserID
Плюс мне любопытно, что вы хотите за лицензии. Вы пытаетесь получить DISTINCT UserId
count
или же count
из всех non null UserIds
, Остальная часть вашего запроса предполагает, что USerId
повторяется в таблице пользователей (что я нахожу очень странным)... Так UserId
5 может существовать 2 или 3 раза, поэтому при подсчете отлично вы получите 1 для идентификатора пользователя 5, а если не добавить отличное, вы получите 2 или 3...
Являются registrations
всегда 1
? Если так то UserId
уникален, и вам не нужны ваши агрегаты в основном запросе. И ответ для процентов всегда будет таким же, как 1/# лицензий.......
Судя по вашим комментариям, это будет запрос, который вы хотели бы.
SELECT
COUNT(UserId) AS Registrations
,SUM(CASE WHEN StripeCustomerId IS NOT NULL THEN 1 ELSE 0 END) AS Licenses
,CASE
WHEN SUM(CASE WHEN StripeCustomerId IS NOT NULL THEN 1 ELSE 0 END) = 0 THEN 0
ELSE COUNT(UserId) / SUM(CASE WHEN StripeCustomerId IS NOT NULL THEN 1 ELSE 0 END)
END AS [Percent]
FROM
Users
WHERE DATEDIFF(hour, FirstContact, DateStamp) <= '12'