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