[英]SQL multiple rows in single row
Hi everyone I have this table and I want to show result in single row group by client id and show availability for stock 1 and 2. 大家好,我有这张桌子,我想按客户ID在单行分组中显示结果,并显示库存1和2的可用性。
Here is my table 这是我的桌子
id client stock material quantity availability date
62 56 1 0 0 100 2017-12-16 23:55:01
63 56 2 0 0 900 2017-12-16 23:55:01
64 56 1 100 -20 80 2017-12-16 23:55:20
65 56 1 80 100 180 2017-12-16 23:56:06
66 56 1 180 200 380 2017-12-16 23:56:21
67 56 1 380 500 880 2017-12-16 23:58:11
68 56 1 880 -580 300 2017-12-16 23:58:38
69 56 2 900 -90 810 2017-12-17 23:59:18
Outcome I want is get result from last date, group by client id and combine stock 1 and stock 2 to single row 我想要的结果是从上次日期获得结果,按客户ID分组,并将库存1和库存2合并为单行
client availability1 availability2
56 300 810
I try this query 我尝试这个查询
SELECT
historys.id
,(CASE WHEN historys.stock = 1 THEN availability END) AS availability1
,(CASE WHEN historys.stock = 2 THEN availability END) AS availability2
FROM historys
GROUP BY historys.client
ORDER by historys.id
The result is 结果是
id availability1 availability2
56 NULL 810
I will be grateful if someone help me. 如果有人帮助我,我将不胜感激。 Thanks.
谢谢。
You need to filter to the right rows before the aggregation. 您需要在聚合之前过滤到正确的行。 Here is one method:
这是一种方法:
SELECT h.client,
MAX(CASE WHEN h.stock = 1 THEN h.availability END) AS availability1
MAX(CASE WHEN h.stock = 2 THEN h.availability END) AS availability2
FROM historys h
WHERE h.date = (SELECT MAX(h2.date) FROM historys h2 WHERE h2.stock = h.stock)
GROUP BY h.client
Use a union 使用工会
SELECT
client, max(availability1) AS availability1, max(availability2) AS availability2
FROM
(
SELECT
client
,availability AS availability1
,0 AS availability2
FROM historys hist
WHERE id = (select max(id) from historys where client = hist.client and stock = 1)
UNION ALL
SELECT
client
,0 AS availability1
,availability AS availability2
FROM historys hist2
WHERE id = (select max(id) from historys where client = hist2.client and stock = 2)
) a
GROUP by client
ORDER by client
The NULL you have is because your selecting data from lines of historys that cannot contain the availability for stock = 1 and stock = 2 at the same time. 您拥有NULL是因为您从历史记录行中选择的数据不能同时包含stock = 1和stock = 2的可用性。
You can bypass that using historys both times like above : 您可以像上面那样两次都使用历史记录来绕过它:
In the subrequest (as d) we get max dates by client, then we join history two times to get both availability in a row. 在子请求(如d)中,我们通过客户端获取最大日期,然后我们两次加入历史记录以连续获取两个可用性。
select d.client,
h1.availability availability1,
h2.availability availability2
from
(
select client,
max(case when stock = 1 then date end) d1,
max(case when stock = 2 then date end) d2
from historys
group by client
) d
join historys h1 on (h1.stock = 1
and h1.date = d.d1
and h1.client = d.client)
join historys h2 on (h2.stock = 2
and h2.date = d.d2
and h2.client = d.client)
You can find an SQLFiddle here : http://sqlfiddle.com/#!9/d1ea4/5 您可以在此处找到SQLFiddle: http ://sqlfiddle.com/#!9/d1ea4/5
Thanks 谢谢
This may help you : 这可以帮助您:
SELECT T.client client ,
SUM(CASE WHEN T.Stock = 1 THEN T.availability
END) availability1 ,
SUM(CASE WHEN T.Stock = 2 THEN T.availability
END) availability2
FROM historys T
INNER JOIN ( SELECT MAX(date) Max_Date ,
stock
FROM historys
GROUP BY stock
) T1 ON T1.Max_Date = T.date
AND T1.stock = T.stock
GROUP BY T.client
Depending on your MySQL version, you should be able to do this with a window function & a common table expression: 根据您的MySQL版本,您应该能够使用窗口函数和通用表表达式来执行此操作:
-- Build derived src table with "latest date" rows
WITH src AS (
SELECT id, client, stock, material, quantity, availability, date
FROM (
SELECT
id, client, stock, material, quantity, availability, date,
ROW_NUMBER() OVER(PARTITION BY client, stock ORDER BY date DESC) ClientStockRank -- For each (client, stock) pair, rank each row by date
FROM historys a
) src
WHERE ClientStockRank = 1 -- Only get rows with "latest date"
)
SELECT
client,
MAX(CASE WHEN stock = 1 THEN availability ELSE NULL) END AS Availability1, -- Get "max" value for "stock 1"
MAX(CASE WHEN stock = 2 THEN availability ELSE NULL) END AS Availability2 -- Get "max" value for "stock 2"
FROM src
GROUP BY client
I think you need MySQL 8+. 我认为您需要MySQL 8+。 If not, there should be other ways to do it too.
如果没有,应该也有其他方法可以做到。 Let me know if that works.
让我知道是否可行。
Update 更新资料
Actually, this should also suffice: 实际上,这也应满足:
SELECT DISTINCT
client,
MAX(CASE WHEN stock = 1 THEN availability ELSE NULL) OVER(PARTITION BY client ORDER BY date DESC) AS Availability1,
MAX(CASE WHEN stock = 2 THEN availability ELSE NULL) OVER(PARTITION BY client ORDER BY date DESC) AS availability2
FROM historys
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.