无法编辑查询中的字段

问题描述

这是我第一次在这个论坛上找不到问题的答案,所以我决定注册并发布。

我在编辑查询中的字段时遇到问题。我有 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 查询,因为它们似乎填充得更快。

解决方法

要了解您在处理什么,我会

  1. 为去年的 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
  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)
  1. 创建您的主要查询
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 上编写的。