Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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
Sql server 在Sql上计算中值_Sql Server - Fatal编程技术网

Sql server 在Sql上计算中值

Sql server 在Sql上计算中值,sql-server,Sql Server,我对SQL非常陌生。我正在尝试使用下面的代码,它不断给我以下错误- Msg ORDER BY子句在中无效 视图、内联函数、派生 表、子查询和公共表 表达式,除非使用TOP或FOR XML 也指定了 “2”附近的语法不正确 有人能帮忙吗?我哪里出错了 我只是想计算中位数 有人可以建议修改这个代码,因为我已经拿起别人的工作 任何帮助都将不胜感激 SELECT TOP (100) PERCENT Name, Sales Median FROM (SELECT a1.

我对SQL非常陌生。我正在尝试使用下面的代码,它不断给我以下错误-

Msg ORDER BY子句在中无效 视图、内联函数、派生 表、子查询和公共表 表达式,除非使用TOP或FOR XML 也指定了

“2”附近的语法不正确

有人能帮忙吗?我哪里出错了

我只是想计算中位数

有人可以建议修改这个代码,因为我已经拿起别人的工作

任何帮助都将不胜感激

SELECT
    TOP (100) PERCENT Name, Sales Median
FROM
    (SELECT 
         a1.Name, a1.Sales, COUNT(a1.Sales) Rank
     FROM          
         PSE.vw_EM_Data a1, PSE.vw_EM_Data a2
     WHERE      
         a1.Sales < a2.Sales OR
         (a1.Sales = a2.Sales AND a1.Name <= a2.Name)
     GROUP BY 
         a1.Name, a1.Sales
     ORDER BY 
         a1.Sales DESC) a3
WHERE 
    Rank = (SELECT (COUNT(*) + 1) DIV 2 FROM Total_Sales);
WHERE     
    (Name LIKE 'John%') 
    AND (DISPOSAL = '1') 
    AND (DATE BETWEEN CONVERT(DATETIME, '2010-04-01 00:00:00', 102) AND CONVERT(DATETIME, '2011-03-30 00:00:00', 102))

您的问题来自子选择a3中的订单


为什么不看一下如何使用一些东西来指出:

1我永远不会使用您在内部SELECT中使用的旧式联接语法-它很容易导致不需要的笛卡尔乘积-就像您的情况一样,尽管我不确定这是否需要

因此,不是:

FROM          
   PSE.vw_EM_Data a1, PSE.vw_EM_Data a2
我建议使用正确的ANSI连接语法

FROM          
   PSE.vw_EM_Data a1  
INNER JOIN           -- or possibly: LEFT OUTER JOIN or even FULL OUTER JOIN
   PSE.vw_EM_Data a2 ON a1.Sales = a2.Sales
这会让你更清楚你真正想要的是什么,并避免任何不必要的问题

2在第二个WHERE子句中,首先不需要所有括号,最重要的是,不应该将DATE或DATETIME列转换为字符串,然后进行比较,因此:

WHERE     
    (Name LIKE 'John%') 
    AND (DISPOSAL = '1') 
    AND (DATE BETWEEN CONVERT(DATETIME, '2010-04-01 00:00:00', 102) AND CONVERT(DATETIME, '2011-03-30 00:00:00', 102))
改用这个:

WHERE     
    Name LIKE 'John%'
    AND DISPOSAL = '1'
    AND [DATE] BETWEEN '2010-04-01T00:00:00' AND '2011-03-30T00:00:00'

我也会尽量避免使用SQL-like-DATE中的关键字名称来调用列-您必须在其周围使用方括号,以使SQL Server清楚地了解情况。

请将您查询的格式设置为代码示例-使其可读。