Использование WITH SQL Query с PHP - PullRequest
2 голосов
/ 07 февраля 2012

Я попытался переписать приведенный ниже запрос, чтобы он работал на странице PHP, но я не смог найти какой-либо документации о том, как использовать оператор «; WITH» в PHP или как сделать тот же эффект с действительным PHP-запросом. Запрос отлично работает при выполнении в MS SQL 2008 R2 Management Studio, но выдает ошибки при попытке загрузить его в MSSQL PHP Generator из SQLMaestro.

Запрос:

;WITH UserStars AS
(
    SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars
    FROM score b
    JOIN game_users a ON a.id = b.game_users_id
    GROUP BY a.username
)
SELECT  CASE WHEN Stars < 1.4 THEN 'StarAmount1'
        WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
        WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
        WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
        WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END         StarAmount,
        COUNT(*) Users
FROM UserStars
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1'
         WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
         WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
         WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
         WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END

Может ли кто-нибудь указать мне правильное направление, чтобы один и тот же запрос мог использоваться как в PHP, так и в студии управления MS SQL 2008 R2?

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Попробуй так:

SELECT  CASE WHEN Stars < 1.4 THEN 'StarAmount1'
        WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
        WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
        WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
        WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END         StarAmount,
        COUNT(*) Users
FROM (SELECT a.username, ROUND(AVG(CAST(b.stars AS FLOAT)),1) Stars
    FROM score b
    JOIN game_users a ON a.id = b.game_users_id
    GROUP BY a.username) UserStars
GROUP BY CASE WHEN Stars < 1.4 THEN 'StarAmount1'
         WHEN Stars BETWEEN 1.4 AND 2.4 THEN 'StarAmount2'
         WHEN Stars BETWEEN 2.4 AND 3.4 THEN 'StarAmount3'
         WHEN Stars BETWEEN 3.4 AND 4.4 THEN 'StarAmount4'
         WHEN Stars BETWEEN 4.4 AND 5.0 THEN 'StarAmount5' ELSE 'AnotherStarAmount' END
0 голосов
/ 09 февраля 2012

Не совсем интуитивно понятный подход, а другой способ избавиться от кошки без всех выражений CASE:

;WITH x AS 
(
    SELECT 
        c = game_users_id, 
        [avg] = AVG(CONVERT(DECIMAL(2,1), stars))
    FROM score
    GROUP BY game_users_id
), 
y AS
(
    SELECT StarAmount = 'StarAmount' 
        + LEFT(CONVERT(DECIMAL(2,1), [avg]+.6), 1)
        FROM x
)
SELECT StarAmount, Users = COUNT(*)
    FROM y
    GROUP BY StarAmount
    ORDER BY StarAmount;
...