问题描述
这是我第一次在这个论坛上找不到问题的答案,所以我决定注册并发布。
我在编辑查询中的字段时遇到问题。我有 2 个要从中提取数据的表,但我需要今年和去年(按季度)第二个表中的 2 组数据。我需要能够编辑选定的列(即选择一个人)。
成员表(选定的是是/否字段,默认为否)
| ID | Name | Selected | Status |
| 1 | Bob | No | M |
| 2 | Sam | No | M |
印花税表
| ID | DuesYear | Q1_Date | Q2_Date | Q3_Date | Q4_Date |
| 1 | 2020 | 1/1/20 | 4/1/20 | 7/1/20 | 10/1/20 |
| 1 | 2021 | 1/2/21 | 2/1/21 | | |
| 2 | 2020 | 1/2/20 | 4/2/20 | 7/2/20 | 10/2/20 |
| 2 | 2021 | 1/2/21 | | | |
我正在寻找当前年份和去年日期的汇总,但随后需要能够“选择”一个人。
|Selected|Name |Last_Q1|Last_Q2|Last_Q3|Last_Q4|This_Q1|This_Q2|This_Q3|This_Q4|
| # | Bob |1/1/20 |4/1/20 |7/1/20 |10/1/20|1/2/21 |2/1/21 | | |
| # | Sam |1/2/20 |4/2/20 |7/2/20 |10/2/20|1/2/21 | | | |
我最初尝试了 join 语句,但无法选择人员。我现在使用更简单的代码,但仍然无法选择一个人。
SELECT
Selected,Name,(SELECT Q1_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)-1) AS [Last Q1],(SELECT Q2_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)-1) AS [Last Q2],(SELECT Q3_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)-1) AS [Last Q3],(SELECT Q4_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)-1) AS [Last Q4],(SELECT Q1_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)) AS [This Q1],(SELECT Q2_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)) AS [This Q2],(SELECT Q3_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)) AS [This Q3],(SELECT Q4_Date FROM StampDues WHERE [Member ID] = Members.MemberID AND DuesYear = year(Now)) AS [This Q4]
FROM Members
WHERE GetIsMemberStatus(Status) = True
ORDER BY Name;
GetIsMemberStatus 是我创建的返回 True 或 False 的自定义函数。这似乎不是问题,因为它正在正确过滤名称。
请注意,我使用此查询作为连续子表单的控制源。我可以让子表单与大量的日期查找字段一起正常工作,但这会缓慢填充。我更喜欢 sql 查询,因为它们似乎填充得更快。
解决方法
要了解您在处理什么,我会
- 为去年的 StampDues 创建一个查询 - q_LastYearDues
SELECT [Member ID] as MemberID,Q1_Date as [Last Q1],Q2_Date as [Last Q2],Q3_Date as [Last Q3],Q4_Date as [Last Q4]
FROM StampDues WHERE DuesYear = year(now)-1
- 为今年的 StampDues 创建一个查询 - q_ThisYearDues
SELECT [Member ID] as MemberID,Q1_Date as [This Q1],Q2_Date as [This Q2],Q3_Date as [This Q3],Q4_Date as [This Q4]
FROM StampDues WHERE DuesYear = year(now)
- 创建您的主要查询
SELECT a.Selected,a.Name,b.[Last Q1],b.[Last Q2],b.[Last Q3],b.[Last Q4],c.[This Q1],c.[This Q2],c.[This Q3],c.[This Q4]
From Members a
left join q_LastYearDues b on a.MemberID=b.MemberID
left join q_ThisYearDues c on a.MemberID=c.MemberID
通过这种方式,您可以独立运行每个查询以找出您的问题所在 - 可能是连接到整数的文本值或类似的东西。前 2 个查询应该是可更新的。
还要确保在表上定义主键,因为有时这会使表成为只读。
,我认为您能够使其工作的唯一方法是将 Make-Table 查询 (SELECT xxx INTO tempTable FROM xxx) 放入临时表中,并插入布尔“Selected”列作为查询。您每次都需要删除临时表,然后使用 Make-Table 查询重新创建它。
然后就可以将临时表绑定到连续表上。您需要代码或 SQL 才能将数据输入回数据库。
,从您说的句子中可以看出,“我正在寻找当前年份和去年日期的汇总,但随后需要能够‘选择’一个人。”我的理解是您想要MemberID
。如果是这样,那么我可能会为您提供解决方案。
SQL
DECLARE @MEMBER TABLE( ID INT,[NAME] VARCHAR(30),SELECTED BIT,[Status] VARCHAR(2));
DECLARE @StampDues TABLE( ID INT,DuesYear VARCHAR(10),Q1_Date DATE,Q2_Date DATE,Q3_Date DATE,Q4_Date DATE);
INSERT INTO @MEMBER VALUES(1,'Bob','M');
INSERT INTO @MEMBER VALUES(2,'Sam',1,'M');
INSERT INTO @StampDues VALUES(1,'2020','1/1/20','4/1/20','7/1/20','10/1/20');
INSERT INTO @StampDues VALUES(1,'2021','1/2/21','2/1/21',null,null);
INSERT INTO @StampDues VALUES(2,'1/2/20','4/2/20','7/2/20','10/2/20');
INSERT INTO @StampDues VALUES(2,null);
WITH summary AS (
Select s.*,m.NAME,m.SELECTED,ROW_NUMBER() OVER(PARTITION BY m.ID
ORDER BY s.DuesYear DESC) AS rn
FROM @MEMBER m
INNER JOIN @StampDues s ON m.ID=s.ID
)
SELECT s.ID MEMBERID,s.NAME,s.SELECTED,s.Q1_Date Last_Q1,s.Q2_Date Last_Q2,s.Q3_Date Last_Q3,s.Q3_Date Last_Q4,s1.Q1_Date This_Q1,s1.Q2_Date This_Q2,s1.Q3_Date This_Q3,s1.Q3_Date This_Q4
FROM summary s
INNER JOIN summary s1 ON s1.rn=1 and s.rn=2 and s.ID=s1.ID
有条件更新你可以在WITH summary AS(......)
=>
UPDATE @MEMBER SET SELECTED=1 WHERE ID IN
(SELECT s.ID MEMBERID
--,-- s.Q3_Date Last_Q3,--s1.Q1_Date This_Q1,-- s1.Q3_Date This_Q3,s1.Q3_Date This_Q4
FROM summary s
INNER JOIN summary s1 ON s1.rn=1 and s.rn=2 and s.ID=s1.ID
WHERE s.SELECTED=0 --your condition
)
SELECT * FROM @MEMBER;--To Check the data is Updated
注意:现在,如果您想更新您的 MEMBER
表,您可以使用 MEMBERID
并且您还可以根据您的要求操作查询。请检查代码并告诉我。查询是在 SQL SERVER 16 上编写的。