Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 Server - Fatal编程技术网

Sql server 按度量值排序,但将相关行放在一起

Sql server 按度量值排序,但将相关行放在一起,sql-server,Sql Server,为了用一个简单的查询对数据进行排序,我在查询中被困了几天 由于我的数据有点复杂,我举了一个数据示例 以下是数据表(原始数据)的摘录: 这是我求和时的结果(仅数量QTY,取决于它是售出的还是在两个不同的列中退回的)-订购人:QtySold,然后QtyRet,然后Prod Prod --- QtySold --- QtyRet --- Info Chairs --- 95 ------ / ------ Sold Tables --- 33 ------ / ------ Sold Book --

为了用一个简单的查询对数据进行排序,我在查询中被困了几天

由于我的数据有点复杂,我举了一个数据示例

以下是数据表(原始数据)的摘录:

这是我求和时的结果(仅数量
QTY
,取决于它是售出的还是在两个不同的列中退回的)-订购人:
QtySold
,然后
QtyRet
,然后
Prod

Prod --- QtySold --- QtyRet --- Info
Chairs --- 95 ------ / ------ Sold
Tables  --- 33 ------ / ------ Sold
Book --- 22 ------ / ------ Sold
Computer --- 22 ------ / ------ Sold
Lamp --- 19 ------ / ------ Sold
Desk --- 11 ------ / ------ Sold
Chairs --- / ------ 5 ------ Returned
Computer --- / ------ 2 ------ Returned
Tables --- / ------ 2 ------ Returned
我希望以不同的方式订购:在本例中,我希望按
QtySold
订购,但是如果
Prod
出现两次,我希望第二个直接位于第一个下方(如椅子-95-/-售出,然后椅子-/-5-退回,等等)

下面是代码(可能包含错误,因为我直接在这里编写):

我希望得到的结果是:

Prod --- QtySold --- QtyRet --- Info
Chairs --- 95 ------ / ------ Sold
Chairs --- / ------ 5 ------ Returned --(because Chair is first with 95 Sold)
Tables  --- 33 ------ / ------ Sold
Tables --- / ------ 2 ------ Returned --(because Table is 2nd with 33 Sold)
Book --- 22 ------ / ------ Sold
Computer --- 22 ------ / ------ Sold
Computer --- / ------ 2 ------ Returned --(because Computer is 4th w 22Sold)
Lamp --- 19 ------ / ------ Sold
Desk --- 11 ------ / ------ Sold
(按DESC:95-33-22-22-19-11对
QtySold
进行排序) (但第一项(椅子)也是“返回”信息,因此我需要将其直接显示在其下方)


有可能以不同的方式进行“订购”吗?我希望避免使用UNION ALL,因为我的表包含的列太多。

创建一个CTE,并将查询(不带ORDER BY子句)包含在其中,然后执行条件排序:

with cte as (
  <your query here>
)
select * from cte c
order by 
  case 
    when coalesce(c.QtySold, 0) <> 0 then c.QtySold
    else (select QtySold from cte where prod = c.prod and coalesce(QtySold, 0) <> 0) 
  end desc,
  QtySold DESC, prod
使用CTE进行如下尝试-

WITH CTE
AS
(
    SELECT Products,SUM(qty) Q,Info
    FROM your_table
    GROUP BY Products,Info
)

SELECT A.*
FROM CTE2 A
ORDER BY 
(SELECT Q FROM CTE2 B WHERE B.Info = 'Sold' AND B.Products = A.Products)  DESC,
1, 
CASE WHEN info = 'Sold' THEN 1 ELSE 2 END

从最终结果中删除
Info
字段。将
QtySold
重命名为
saled
并将
QtyRet
重命名为
Returned
。这样您就不需要
Info
列了。然后按
QtySold
(售出)降序排序。别忘了把
ttt.Info
groupby
orderby
中删除,如果你在同一行中得到-Chair-5(selled)-2(returned)的结果可以吗?您好,把所有内容都放在同一列中是“可以”的,但这会使我原来的表读起来非常复杂,所以我需要避免这样做(这就是我问的原因。)对于@WEI_DBA,我同意列信息是不必要的!您好@mkRabbani,谢谢您的回答,这就是我实际使用的,但我需要将它们分成不同的行(遗憾的是:()更简化,无需选择最后一列。对于两种不同产品的相同最高销售量,需要在查询中添加一个订单。已更新。明天我将在我的代码中尝试此操作,我将告诉您是否有效!我已尝试此请求(第一个),它非常有效!谢谢大家:)
with cte as (
  <your query here>
)
select * from cte c
order by 
  case 
    when coalesce(c.QtySold, 0) <> 0 then c.QtySold
    else (select QtySold from cte where prod = c.prod and coalesce(QtySold, 0) <> 0) 
  end desc,
  QtySold DESC, prod
order by 
  case 
    when c.QtySold <> 0 then c.QtySold
    else (select QtySold from cte where prod = c.prod and QtySold <> 0) 
  end desc,
  QtySold DESC, prod
WITH CTE
AS
(
    SELECT Products,SUM(qty) Q,Info
    FROM your_table
    GROUP BY Products,Info
)

SELECT A.*
FROM CTE2 A
ORDER BY 
(SELECT Q FROM CTE2 B WHERE B.Info = 'Sold' AND B.Products = A.Products)  DESC,
1, 
CASE WHEN info = 'Sold' THEN 1 ELSE 2 END