Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL到MSSQL查询转换_Mysql_Sql_Sql Server_Odbc_Ssms - Fatal编程技术网

MySQL到MSSQL查询转换

MySQL到MSSQL查询转换,mysql,sql,sql-server,odbc,ssms,Mysql,Sql,Sql Server,Odbc,Ssms,谈到MSSQL,我是一个新手,一直在尝试转换下面的MySQL查询,没有任何乐趣。我正在通过ODBC连接到Microsoft SQL Server Management Studio中的MySQL数据库。这非常有效,非常简单的查询也很有效。然而,下面的查询有点复杂(并且可能没有优化),我无法让它工作 下面的第一个查询是原始的MySQL查询,第二个查询是我尝试的MSSQL翻译 MySQL查询 SELECT timestamp, `First Name`, `Last Name`, `Emai

谈到MSSQL,我是一个新手,一直在尝试转换下面的MySQL查询,没有任何乐趣。我正在通过ODBC连接到Microsoft SQL Server Management Studio中的MySQL数据库。这非常有效,非常简单的查询也很有效。然而,下面的查询有点复杂(并且可能没有优化),我无法让它工作

下面的第一个查询是原始的MySQL查询,第二个查询是我尝试的MSSQL翻译

MySQL查询

    SELECT timestamp, `First Name`, `Last Name`, `Email Address`, `Department`, `Case`, `Partner`, `Category`, `Tag Title`, `Question`, `Answer`,
        MAX(CASE `Secondary Metric Question` WHEN 'Support' THEN `Secondary Metric Question` end)  AS 'Metric 1 Title',
        MAX(CASE `Secondary Metric Question` WHEN 'Support' THEN `Answer` end)  AS 'Metric 1 Answer',
        MAX(CASE `Secondary Metric Question` WHEN 'Completeness' THEN `Secondary Metric Question` end)  AS 'Metric 2 Title',
        MAX(CASE `Secondary Metric Question` WHEN 'Completeness' THEN `Answer` end)  AS 'Metric 2 Answer',
        MAX(CASE `Secondary Metric Question` WHEN 'Policy' THEN `Secondary Metric Question` end)  AS 'Metric 3 Title',
        MAX(CASE `Secondary Metric Question` WHEN 'Policy' THEN `Answer` end)  AS 'Metric 3 Answer',
        `Message`, 
        CASE `Reply Requested` WHEN 1 THEN "YES" ELSE "NO"  END AS "Reply Requested",
        `Response Session`
    FROM (
        SELECT T0.timestamp, T8.first_name AS 'First Name', T8.last_name AS 'Last Name', T8.email AS 'Email Address', T0.dept AS 'Department', T0.case AS 'Case', T0.partner AS 'Partner', T3.title AS 'Category', T2.title AS 'Question', T2.private_title AS 'Tag Title', T6.title AS 'Secondary Metric Question', T0.answer AS 'Answer', T4.key AS 'Message', T4.reply_requested AS 'Reply Requested', T0.response_session AS 'Response Session'
                FROM responses AS T0

                    LEFT JOIN qrs_metrics AS T1
                    ON T0.qrs_metric_id = T1.qrs_metric_id

                    LEFT JOIN quick_responses AS T2
                    ON T1.qrs_id = T2.qrs_id

                    LEFT JOIN custom_categories AS T3
                    ON T2.category = T3.original_id AND T3.user_id = T2.user_id

                    LEFT JOIN rre_aggregates AS T4
                    ON T0.comment_id = T4.id

                    LEFT JOIN widget_responses AS T5
                    ON T0.widget = T5.id

                    LEFT JOIN secondary_metrics AS T6
                    ON T1.metric_id = T6.id

                    LEFT JOIN private_messages AS T7
                    ON T4.id = T7.comment_id AND T7.type = 3

                    LEFT JOIN users AS T8
                    ON T2.user_id = T8.user_id

                    WHERE T0.timestamp >= '2014-02-17 00:00:00'
                    AND T0.qrs_metric_id = T1.qrs_metric_id

    ) tmp_table
    GROUP BY `Response Session`
<pre>
<?php
class DB_mssql
{

    function modifyQuery($query)
    {

        $query = str_replace("`", "", $query);
        $query = str_replace( array('[',']') , ''  , $query );

        $tablesName = $this->getTableName($query);  

        $tableNamesWithoutAlise = $this->removeAliseName($tablesName);

        $tableNamesWithPrefix = $this->prefixDBName($tableNamesWithoutAlise);

        // Group By Function Call
        $query = $this->getGroupBy($query);

        // Order By Function Call
        $query = $this->getOrderBy($query);

        //replace Limit keyword with TOP keyword
        $query = $this->getLimit($query);

        // MSSQLDateFormat function call
        $query = $this->getMSSQLDateFormat($query);

        /*force index => WITH index*/
        preg_match_all("#\sforce[\s]*index[\s]*\(\w*\)[\s]*#i",$query,$forceIndex);
        if(!empty($forceIndex['0']['0']))
        {
            $forceString = $forceIndex['0']['0'].')';
            $forceString = str_ireplace('force index','WITH (index',$forceString);
        }
        // Changed use index to with index  
        preg_match_all("#\suse[\s]*index[\s]*\(\w*\)[\s]*#i",$query,$useIndex);
        if(!empty($useIndex['0']['0']))
        {
            $useString = $useIndex['0']['0'].')';
            $useString = str_ireplace('use index','WITH (index',$useString);
        }
        /*Interval 10 date*/
        preg_match_all("#INTERVAL\s[0-9]*\sday#i",$query,$intervalIndex);
        if(!empty($intervalIndex[0][0]))
        {
            $intervalString = explode(" ",$intervalIndex[0][0]);
            $intervalString = $intervalString[1];
        } else {
            $intervalString = '';
        }

        // Patterns
        $patterns[0] ='#(?<![\w])secure_pgatxn.(?![\w][.])#i';
        $patterns[1] ='#(?<![\w])secure_pga.(?![\w][.])#i';
        $patterns[2] ='#\sIFNULL#i';
        $patterns[3] = '#[\s]{1,}WHERE[\s]{1,}1#i';// where 1 should be replaced with WHERE 1=1     
        $patterns[4] ='#\sforce index[\s]*\(\w*\)[\s]*#i';// Force Index is replaced with With Index
        $patterns[5] ='#\suse\sindex[\s]*\(\w*\)[\s]*#i';// use Index is replaced with with index
        $patterns[6] ='#[\s]*&&{1}[\s]*#i';
        $patterns[7] = '#IF[\s]*\([\s]*#i';// IF should be replaced with where IIF
        $patterns[8] = '#now\([\s]*#i';// Now() function should be replaced with getutcdate()
        $patterns[10] = '#[\W]DATE[\s]*\([\s]*#i';// Mysql Date() is changed to  CONVERT (date,GETDATE())       
        $patterns[11] = '#DATE_FORMAT[\s]*\([\s]*#i';// date_format() function should be replaced with format
        $patterns[12] = '#[\s]*(%Y{1}-%m{1}-%d{1})#i';// Change '%Y-%m-%d' patteren to 'yyyy-MM-dd'
        $patterns[13] = '#%m{1} %d{1}#i';// Change '%m %d' patteren to 'MM dd'  \'
        $patterns[14] = '#DATE_SUB\([\s]*#i';// DATE_SUB() function accepts 3 parameters// curdate
        $patterns[15] = '#CURDATE\([\s]*#i';// DATE_SUB() function accepts 3 parameters// curdate
        $patterns[16] ='#\,[\s]*INTERVAL\s[0-9]*\sDAY#i';// INTERVAL 1 DAY is replaced with ''
        $patterns[17] ='#[\s]*DATE_ADD\([\s]*#i';// Mysql Date() is changed to  CONVERT (date,GETDATE())
        $patterns[18] ='#[\s]*\|\|[\s]*#i'; // || to OR 
        $patterns[19] ='#(?<![\w])secure_lib.(?![\w][.])#i';
        $patterns[20] = '#UCASE\([\s]*#i';

        // Replacement Queries
        $replacements[0] = ' '; 
        $replacements[1] = ' '; 
        $replacements[2] = ' ISNULL';
        $replacements[3] = ' WHERE 1=1 ';
        $replacements[4] = isset($forceString)?$forceString:''.' '; 
        $replacements[5] = isset($useString)?$useString:''.' '; 
        $replacements[6] = ' AND ';
        $replacements[7] = 'IIF('; 
        $replacements[8] = 'GETDATE(';
        $replacements[10] = ' CONVERT(date,';       
        $replacements[11] = 'FORMAT(';
        $replacements[12] = 'yyyy-MM-dd'; 
        $replacements[13] = 'MM dd';
        $replacements[14] = ' DATEADD(DAY,-'.$intervalString.','; 
        $replacements[15] = 'GETDATE('; 
        $replacements[16] = '';
        $replacements[17] = ' DATEADD(DAY,'.$intervalString.',';
        $replacements[18] = ' OR ';
        $replacements[19] = ' '; 
        $replacements[20] = 'UPPER(';

        $query = preg_replace($patterns, $replacements, $query);
        $query = $this->strReplaceTableName($query, $tableNamesWithPrefix); 
        return $query;

    }
    // Function To Change Limit to Top 
    function getLimit($query)
    {
        preg_match_all("#LIMIT[^\w]{1,}([0-9]{1,})[\s]*([\,]{0,})[\s]*([0-9]{0,})#i",$query,$matches);
        $patterns = '#LIMIT[^\w]{1,}([0-9]{1,})[\s]*([\,]{0,})[\s]*([0-9]{0,})#i';
        $replacements = '';
        $query = preg_replace($patterns, $replacements, $query);
        if(!empty($matches[1][0]) && empty($matches[3][0]))
        {
            $query = str_ireplace("SELECT ", "SELECT TOP ".$matches[1][0]." ", $query);
        }
        else if(!empty($matches[3][0]))
        {
            $limitQuery = " OFFSET  ".$matches[1][0]." ROWS FETCH NEXT ".$matches[3][0]." ROWS ONLY";
            if(stripos($query, "ORDER BY"))
                {
                    $query .= $limitQuery;
                }
                else
                {
                $selectList = $this->selectList($query,"SELECT","FROM");
                $selectList = $this->sqlParser($selectList);
                $selectList = preg_replace('#[\s]as[\s]\w*#i', " ", $selectList); 
                $query .= " ORDER BY ".$selectList[0].$limitQuery;
                }
        }

        return $query;
    }
    // Function To Change DateFormat
    function getMSSQLDateFormat($query)
    {
            if(stripos($query, "%b %d"))
            {
                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'%b{1}[\s]*%d{1}\'[\s]*\)#iU",$query,$dateFormat);
                if(!empty($dateFormat))
                    {
                        $columnName = explode(",",$dateFormat[0][0]);
                        $columnName = str_ireplace("date_format(","",$columnName[0]);
                        $query = str_ireplace($dateFormat[0][0],"convert(char(3), ".$columnName.", 0)+' '+CONVERT(char(2), ".$columnName.", 4)",$query);
                    }
                return $query;
            }
            else if(strpos($query, "%Y-%M"))
            {
                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'%Y{1}[\s]*-%M{1}\'[\s]*\)#iU",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0],"DATENAME(year,".$columnName.")+'-'+DATENAME(month,".$columnName.")",$query);
                return $query;
            }
             else if(stripos($query, "%Y-%m"))
            {
                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'%Y{1}[\s]*-%m{1}\'[\s]*\)#iU",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0],"CONVERT(VARCHAR(7), ".$columnName.", 120)",$query);
                return $query;
            }
              else if(stripos($query, "%M %d, %Y") || stripos($query, "%M %d. %Y"))
            {
                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'%M{1} %d{1}[\,|\.][\s]*%Y{1}\'[\s]*\)#iU",$query,$dateFormat);
                foreach($dateFormat[0] as $key => $value)
                {
                    $columnName = explode(",",$dateFormat[0][$key]);
                    $columnName = str_ireplace("date_format(","",$columnName[0]);
                    $query = str_ireplace($dateFormat[0][$key],"CONVERT(VARCHAR(12), ".$columnName.", 107)",$query);


                }
                return $query;


            }
             else if(stripos($query, "%d/%m/%Y %H:%i:%S"))
            {

                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'\%d/\%m/\%Y[\s]*\%H:\%i:\%S\'[\s]*\)#iU",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0],"CONVERT(VARCHAR(10), ".$columnName.", 103)+' '+CONVERT(VARCHAR(18),".$columnName.",108)",$query);
                return $query;


            }
             else if(stripos($query, "%d%m%Y"))
            {
                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w]*.*\)#i",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0]," REPLACE(CONVERT(VARCHAR(10),".$columnName.",103), '/','')",$query);
                return $query;


            }

             else if(stripos($query, "%d/%m/%Y"))
            {
                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'\%d{1}/\%m{1}/\%Y{1}\'[\s]*\)#iU",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0],"CONVERT(VARCHAR(10), ".$columnName.", 103)",$query);
                return $query;


            }
             else if(stripos($query, "%d %M,%Y"))
            {

                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'\%d{1}[\s]*\%M{1}[,]\%Y{1}\'[\s]*\)#iU",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0],"CONVERT(VARCHAR(11), ".$columnName.", 106)",$query);
                return $query;


            }
             else if(stripos($query, "%H:00"))
            {

                preg_match_all("#DATE_FORMAT[\s]*\([\s]*[\w].*[,]{1}[\s]*\'[\s]*\%H{1}:00[\s]*\'[\s]*\)#iU",$query,$dateFormat);
                $columnName = explode(",",$dateFormat[0][0]);
                $columnName = str_ireplace("date_format(","",$columnName[0]);
                $query = str_ireplace($dateFormat[0][0],"RIGHT(100 + DATEPART(HOUR, ".$columnName."),2)+':00'",$query);


                return $query;


            }
             else if(stripos($query, "datediff"))
            {
                preg_match_all("#datediff[\s]*\([\s]*[\w].*[,]{1}[\s]*[\w].*[\s]*\)#iU",$query,$dateDiff);

                if (isset($dateDiff[0])) {

                    foreach($dateDiff[0] as $key => $value)
                    {
                        $columnName = explode(",",$dateDiff[0][$key]);
                        if (count($columnName) < 3) {
                            $Param1 = substr($columnName[1],0,-1);
                            $Param2 = str_ireplace("datediff("," ",$columnName[0]); 
                            $query = str_ireplace($dateDiff[0][$key],"datediff(DAY,$Param1,$Param2)",$query);
                        }
                    }
                }

                return $query;
            }

            else
            {
                return $query;
            }
    }
    // Function To Select List To Order BY Clause
    function getOrderBy($query)
    {
        /*Order By functionality starts*/
        preg_match_all("#order[\s]by[^\w]{1,}([0-9]{1,})([\,]{0,})([0-9]{0,})#i",$query,$orderByNum);

        if(!empty($orderByNum[0]))
        {
        $selectList = $this->selectList($query,"SELECT","FROM");
        $orderByList = $this->orderByList($query,"ORDER BY","DESC");

        $selectList = $this->sqlParser($selectList);

        $selectList = preg_replace('#[\s]as[\s]{1,}\w*#i', " ", $selectList);
        $orderByArr = explode(",",$orderByList);
        $orderByArr = array_map('trim',$orderByArr);
        /**Code for gropup by 1*/
        if(!empty($orderByNum[0])) 
        {
            $orderByCol=array();
            foreach($orderByArr as $colno)
            {
                        $orderByCol[]=$selectList[$colno-1];
            }
        }
        if(!empty($orderByNum[0]))
        {
            $orderBy = implode(",",$orderByCol);
        }

        if(stripos($query, "ORDER BY"))
        {
            $query = preg_replace('#order[\s]by[^\w]{1,}([0-9]{1,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})([\,]{0,})([0-9]{0,})#i', "ORDER BY $orderBy ", $query);                  
        }
        }
        return $query;
        /*Ends here*/
    }

    // Function To Select List To Group BY Clause
    function getGroupBy($query)
    {
        preg_match_all("#group[\s]by\s#i",$query,$groupByWord);
        preg_match_all("#group[\s]by[^\w]{1,}([0-9]{1,})([\,]{0,})([0-9]{0,})#i",$query,$groupByNum);
        $groupBy = !empty($groupByWord[0])?$groupByWord[0]:$groupByNum[0];
        if(!empty($groupBy))
        {
        $selectList = $this->selectList($query,"SELECT","FROM");
        $groupByList = $this->groupByList($query);
        $selectList = $this->sqlParser($selectList);
        $selectList = preg_replace("#[\s]as[\s]{1,}\w*#i", " ", $selectList);
        $selectList = $this->removeAggregateFunc($selectList);
        $groupByArr = explode(",",$groupByList);
        $groupByArr = array_map('trim',$groupByArr);

        /**Code for gropup by 1*/
        if(!empty($groupByNum[0]))
        {
            $groupByCol=array();
            foreach($groupByArr as $colno)
            {

                    $groupByCol[]=$selectList[$colno-1];
            }
        }
        if(!empty($groupByNum[0]))
        {
            $combineVal = array_merge_recursive($groupByCol,$selectList);   
            $combineVal = array_map('trim',$combineVal);
            $combineVal = array_unique($combineVal);
            $groupBy = implode(",",$combineVal);
        }
        else
        {
            $combineVal = array_merge_recursive($groupByArr,$selectList);   
            $combineVal = array_map('trim',$combineVal);
            $combineVal = array_unique($combineVal);
            $groupBy = implode(",",$combineVal);
        }
        $trimmed_array=array_map('trim',$groupByArr);
        if(stripos($query, "ORDER BY"))
        {
            $query = preg_replace('#GROUP BY[\s\S]+?ORDER BY#i', "GROUP BY $groupBy ORDER BY ", $query);
        }
        else
        {
            $query = preg_replace('#GROUP BY[\s]{1,}.*#i', "GROUP BY ".$groupBy, $query);
        }


        }
        return $query;
    }

    // Function To Remove Aggregate Function From group by list
    function removeAggregateFunc($selectList)
    {
        if(!empty($selectList))
        {
            foreach($selectList as $key => $val)
            {
                if(stripos($val, "sum(") !== false)
                {
                    unset($selectList[$key]);

                }
                else if(stripos($val, "count(") !== false)
                {
                    unset($selectList[$key]);
                }
                else if(stripos($val, "MAX(") !== false)
                {
                    unset($selectList[$key]);
                }
                else if(stripos($val, "MIN(") !== false)
                {
                    unset($selectList[$key]);
                }
                else if(stripos($val, "AVG(") !== false)
                {
                    unset($selectList[$key]);
                }
            }

        }
        return $selectList;

    }

    function groupByList($string){

        if(stripos($string, "ORDER BY"))
        {
            preg_match_all("#group\sby(?s)(.*)order\sby#i",$string,$groupByOrderby);
            return $groupByOrderby[1][0];
        }
        else if(stripos($string, "limit"))
        {
            preg_match_all("#group\sby(?s)(.*)\slimit#i",$string,$groupByLimit);
            return  $groupByLimit[1][0];
        }
        else if(stripos($string, "having"))
        {
            preg_match_all("#group\sby(?s)(.*)\shaving#iU",$string,$groupByHaving);
            return  $groupByHaving[1][0];
        }
        else
        {
            preg_match_all("#group\sby(?s)(.*)#i",$string,$groupBy);
            return $groupBy[1][0];
        }
    }
    function orderByList($string, $start, $end){

        $string = ' ' . $string;
        $ini = stripos($string, $start);
        if ($ini == 0) return '';
        $ini += strlen($start);

        if(stripos($string, "DESC") === false)
        {
            return substr($string, $ini);
        }
        else
        {
            $len = stripos($string, $end, $ini) - $ini;
            return substr($string, $ini, $len);
        }
    }

    // Function Used to select column list from Mysql Query
    function selectList($string, $start, $end){
        preg_match_all("#select(?s)(.*)[\W]from#iU",$string,$selectFrom);
        return $selectFrom[1][0];
    }

    // Function Used to select column list from Mysql Query
    function sqlParser($str)
    {
        $str = str_split($str);
            $tokens = array();
            $token = "";
            $stack = array();
            foreach($str as $char) {
                if($char == "," && empty($stack)) {
                    $tokens[] = trim($token);
                    $token = "";
                } else {
                    $token = $token .$char;
                    if($char == '(') {
                        array_unshift($stack, $char);
                    }

                    if($char == ')') {
                        array_shift($stack);
                    }
                }

            }

            $tokens[] = trim($token);
            return $tokens;
    }

    // Function Used to get TableName from Mysql Query
    function getTableName($query)
    {
        $tables = array();
        $query_structure = explode( ' ', strtolower( preg_replace('!\s+!', ' ', $query) ) );
        $searches_from = array_keys( $query_structure , 'from');
        $searches_join = array_keys( $query_structure , 'join');
        $searches_update = array_keys( $query_structure , 'update');
        $searches_into = array_keys( $query_structure , 'into');

        $searches = array_merge($searches_join , $searches_from , $searches_update , $searches_into);
        foreach($searches as $search ){
            if(isset($query_structure[$search+1])){
                $tables[] = trim( $query_structure[$search+1] , '` ');
            }
        }

        $patterns[1] ='#(?<![\w])secure_pgatxn.(?![\w][.])#i';
        $patterns[2] ='#(?<![\w])secure_pga.(?![\w][.])#i';
        $patterns[3] ='#(?<![\w])secure_lib.(?![\w][.])#i';

        $replacements[1] = '';   
        $replacements[2] = '';
        $replacements[3] = '';

        $tables = preg_replace($patterns, $replacements,$tables);

        return $tables;
    }



    // Function Used to Prefix Database Name. In MSSQL, we have to prefix DB Name

    function prefixDBName($tableList)
    {

        $tableArray = array(
        "job_queue_notification_log"=>"secure_pga.dbo.job_queue_notification_log"
        ,"old_pga_customer_card"=>"secure_pga.dbo.old_pga_customer_card"

    );


      $tableNamesWithPrefix = array();
      foreach($tableList as $tableName) {
        $tableNamesWithPrefix[$tableName] = $tableArray[$tableName];
      }

      return $tableNamesWithPrefix;
    }



    function getSubStr($query, $fromStr, $toStr) {
        $fromStrLen = strlen($fromStr);
        $startingPos = stripos($query, $fromStr) + $fromStrLen;
        $endingPos = stripos($query, $toStr);
        if(empty($endingPos))
        {
        return substr($query, $startingPos);    
        }
        else{
            return substr($query, $startingPos, ($endingPos - $startingPos));
        }
    }


    function removeAliseName($tablesName) {
        $cleanTablesName = array();
        foreach($tablesName as $tableName) {
            $temp = explode(" ",$tableName);
            $cleanTablesName[] = trim($temp[0],"[]");
        }
        return $cleanTablesName;
    }

    function strReplaceTableName($query, $tableNames){
        foreach($tableNames as $tableNameBare => $tableNameWithPrefix) {
            if(strlen($tableNameBare)>3){
            $patterns[]='#\b'.$tableNameBare.'\b#iU';
            $replacements[]=$tableNameWithPrefix.'';
            }
        }
        $query = preg_replace($patterns, $replacements, $query);
        return $query;
    }

    // }}}
}
// Object Initializations
$DB_mssql = new DB_mssql();

//Mysql Query
$mysqlQuery = "SELECT id,name FROM table_name WHERE id = 16474 ORDER BY id DESC LIMIT 1,100";

//MSSQL Converted Query
$MssqlQuery = $DB_mssql->modifyQuery($mysqlQuery);

?>

</pre>
MSSQL翻译尝试

    SELECT [timestamp], [First Name], [Last Name], [Email Address], [Department], [Case], [Partner], [Category], [Tag Title], [Question], [Answer],
        MAX(CASE [Secondary Metric Question] WHEN 'Support' THEN [Secondary Metric Question] end)  AS 'Metric 1 Title',
        MAX(CASE [Secondary Metric Question] WHEN 'Support' THEN [Answer] end)  AS 'Metric 1 Answer',
        MAX(CASE [Secondary Metric Question] WHEN 'Completeness' THEN [Secondary Metric Question] end)  AS 'Metric 2 Title',
        MAX(CASE [Secondary Metric Question] WHEN 'Completeness' THEN [Answer] end)  AS 'Metric 2 Answer',
        MAX(CASE [Secondary Metric Question] WHEN 'Policy' THEN [Secondary Metric Question] end)  AS 'Metric 3 Title',
        MAX(CASE [Secondary Metric Question] WHEN 'Policy' THEN [Answer] end)  AS 'Metric 3 Answer',
        [Message], 
        CASE [Reply Requested] WHEN 1 THEN 'YES' ELSE 'NO'  END AS 'Reply Requested',
        [Response Session]
    FROM (
        SELECT T0.[timestamp], T8.first_name AS 'First Name', T8.last_name AS 'Last Name', T8.email AS 'Email Address', T0.dept AS 'Department', T0.[case] AS 'Case', T0.partner AS 'Partner', T3.title AS 'Category', T2.title AS 'Question', T2.private_title AS 'Tag Title', T6.title AS 'Secondary Metric Question', T0.answer AS 'Answer', T4.[key] AS 'Message', T4.reply_requested AS 'Reply Requested', T0.response_session AS 'Response Session'
                FROM AZUREMYSQL...responses AS T0

                    LEFT JOIN AZUREMYSQL...qrs_metrics AS T1
                    ON T0.qrs_metric_id = T1.qrs_metric_id

                    LEFT JOIN AZUREMYSQL...quick_responses AS T2
                    ON T1.qrs_id = T2.qrs_id

                    LEFT JOIN AZUREMYSQL...custom_categories AS T3
                    ON T2.category = T3.original_id AND T3.user_id = T2.user_id

                    LEFT JOIN AZUREMYSQL...rre_aggregates AS T4
                    ON T0.comment_id = T4.id

                    LEFT JOIN AZUREMYSQL...widget_responses AS T5
                    ON T0.widget = T5.id

                    LEFT JOIN AZUREMYSQL...secondary_metrics AS T6
                    ON T1.metric_id = T6.id

                    LEFT JOIN AZUREMYSQL...private_messages AS T7
                    ON T4.id = T7.comment_id AND T7.type = 3

                    LEFT JOIN AZUREMYSQL...users AS T8
                    ON T2.user_id = T8.user_id

                    WHERE T0.timestamp >= '2014-02-17 00:00:00'
                    AND T0.qrs_metric_id = T1.qrs_metric_id

    ) tmp_table
    GROUP BY [Response Session]
我在SSMS中收到的当前错误是

Column 'tmp_table.timestamp' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
如果有人能帮忙,我会非常感激


谢谢

您需要在GROUP BY中包含所有未聚合的列

编辑:此处不能使用DISTINCT,可能与嵌套select一起使用,但GROUP BY就可以了。



使用
DISTINCT
会导致关键字“DISTINCT”附近出现以下错误
语法不正确。
我将把其余列添加到
分组中,然后查看发生了什么。你能看到我的查询还有其他问题吗?必须先解决DISTINCT。没有看到任何其他在MSSQL上不起作用的问题。真糟糕,把其他列添加到
GROUP BY
成功了!我真的觉得我的翻译太离谱了,而且这个错误是第一个。明亮的感谢您的帮助。刚刚意识到查询现在运行正常并返回结果,但它不是在
[Response Session]
上分组,而是返回具有相同
[Response Session]
值的多行?MySQL版本的查询组正确,每个
[Response Session]
值只显示1行。我做错了什么?它将返回多行[Response Session]。您可以通过使用聚合函数(如max)来实现。例如: