Sql 如何基于数据仅显示表中的几列
考虑下表Sql 如何基于数据仅显示表中的几列,sql,sql-server,Sql,Sql Server,考虑下表 Name partno. sch_date WO# owed panels aa 1234 08/22/2017 121 22 26 aa 1234 08/22/2017 222 22 27 aa 1234 08/22/2017 242 22 27 aa 1234 08/29/2017 152 20 24 aa 1234 08/29/2017 167 20
Name partno. sch_date WO# owed panels
aa 1234 08/22/2017 121 22 26
aa 1234 08/22/2017 222 22 27
aa 1234 08/22/2017 242 22 27
aa 1234 08/29/2017 152 20 24
aa 1234 08/29/2017 167 20 24
aa 1234 08/29/2017 202 20 26`
是否有可能以这样的方式显示数据:当面板数量大于所欠数量时,我不会显示其他零件号。安排在同一日期
预期结果
Name partno. sch_date WO# owed panels
aa 1234 08/22/2017 121 22 26
aa 1234 08/29/2017 152 20 24
你可以试试这个-
SELECT Name, partno., sch_date, WO#, owed, panels
FROM YOUR_TABLE
WHERE panels < owed
UNION ALL
SELECT Name, partno., sch_date, MIN(WO#), owed, MIN(panels)
FROM YOUR_TABLE
WHERE panels > owed
GROUP BY Name, partno., sch_date, owed
ORDER BY Name
交叉应用在这里可能会有所帮助。注意,您可以看到为什么我在前面的评论中询问顺序,因为表中记录的顺序是不保证的!我们需要知道您希望对记录进行评估的内容!日期是不够的,除非它有一个不显示的时间成分是不同的 Rextester上的工作示例: 作出了许多假设: 当owned is>面板时,您不需要查看记录。 您希望在欠下的是
SELECT Distinct B.*
FROM tblName Z
CROSS APPLY (SELECT TOP 1 A.*
FROM tblName A
WHERE A.owed < A.panels
and Z.Name = A.Name
and Z.[partno.] = a.[partno.]
and Z.sch_date = a.sch_date
ORDER by A.name, A.[partno.], A.sch_date, A.[wo#]) B
对于运行中的每条记录,一个查询返回名称、零件号和sch_日期的最低wo
更新:
我在一条评论中看到,如果你欠了>面板,你想保留记录。。。如果是先遇到的。。。。但是如果没有先遇到它呢
上次评论更新后:
cte as (
Select A.*, row_number() over (Partition by Name, [partno.], sch_date ORDER BY [WO#]) RN
from tblName A
where owed < panels),
cte2 as (Select * from cte where RN =1
UNION ALL
SELECT Z.*, 0 as rn FROM tblName Z where owed >=panels
and exists (Select * from cte
where Z.name = CTE.name
and Z.[partno.] = cte.[partno.]
and Z.sch_date = cte.sch_date
and CTE.[WO#] > Z.[WO#]))
Select * into SOQ#45619304 from CTE2; --This line creates the table based on the 2nd cte results.
Select * from SOQ#45619304;
如果同一方发生冲突怎么办?案例最有可能是你正在寻找的功能。我不明白,你说你不想看到面板大于欠下的结果,但你的预期结果都比欠下的面板多?是的,我也不知道你是如何从表格中得到预期结果的。例如,并没有一行是owe=20,panels=27,那个么第二行结果来自哪里呢?你需要更清楚地了解你是如何获得“预期结果”的,因为现在这根本没有任何意义。选择8/22的面板=26而不是面板=27的标准是什么?两者都满足您在问题中所述的规则。如果第一行的配电盘数量不超过欠下的配电盘数量,您想怎么办?如果第一行的配电盘数量少于欠下的配电盘数量,则我想显示该数据并移动到下一行。如果第二行的面板大于欠下的面板,那么我想忽略该sch_日期的零件号的其余部分。非常感谢,你一直是一个巨大的帮助OK,所以即使在更高的WO上欠>=个面板,一旦遇到欠
cte as (
Select A.*, row_number() over (Partition by Name, [partno.], sch_date ORDER BY [WO#]) RN
from tblName A
where owed < panels),
cte2 as (Select * from cte where RN =1
UNION ALL
SELECT Z.*, 0 as rn FROM tblName Z where owed >=panels
and exists (Select * from cte
where Z.name = CTE.name
and Z.[partno.] = cte.[partno.]
and Z.sch_date = cte.sch_date
and CTE.[WO#] > Z.[WO#]))
Select * into SOQ#45619304 from CTE2; --This line creates the table based on the 2nd cte results.
Select * from SOQ#45619304;