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 UserIdcount или же 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'
Другие вопросы по тегам