Check_Const
码龄2年
关注
提问 私信
  • 博客:13,054
    问答:760
    13,814
    总访问量
  • 3
    原创
  • 1,653,821
    排名
  • 77
    粉丝
  • 0
    铁粉
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:广东省
  • 加入CSDN时间: 2022-11-18
博客简介:

Check_Const的博客

查看详细资料
个人成就
  • 获得3次点赞
  • 内容获得5次评论
  • 获得36次收藏
  • 代码片获得145次分享
创作历程
  • 4篇
    2022年
成就勋章
创作活动更多

2024 博客之星年度评选报名已开启

博主的专属年度盛宴,一年仅有一次!MAC mini、大疆无人机、华为手表等精美奖品等你来拿!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

sql语句为varchar(n)类型的数据设置完整性约束

答:
创建表后,可试试设置约束Check
Create table store (
    stno char(3) not null,
    address nvarchar(30) not null,
    telephone varchar(11),
    capacity smallint
  constraint PK_store primary key nonclustered  --设置主键
  ( stno ASC )
) --on Check_Data  --测试文件组

Alter table store with check     --设置约束关键字check
   Add constraint CK_store_stno  --约束名CK_store_stno
   Check (patindex('%[^0-9]%', telephone) = 0)  --字段规则

Alter table store check constraint CK_store_stno  --对应上一句约束名CK_store_stno

insert into store(stno,address,telephone,capacity)
values ('001','月亮阁','12345678901',999);  --测试telephone数字字符 正常插入

insert into store(stno,address,telephone,capacity)
values ('002','逍遥湾','12345678-CK',600);  --测试telephone非数字字符应有告警信息

img

回答问题 2022.12.08

EXCEL VBA生成随机数据列并转换格式为数值源代码

发布资源 2022.12.07 ·

oracle数据库自定义函数问题

答:

上传的代码貌似不太友好,还要别人帮你排版

回答问题 2022.12.06

excel vba 执行从 1 到 100 的乘法。执行结果保存成二维数组

答:

代码调整,之前的已删除

'测试用例:新建一个EXCEL表格文件,工作表1为“Sheet1”,工作表2为“Sheet2”
'鼠标右键点击工作表名Sheet1,弹出菜单中选择“查看代码(V)”
'弹出Visual Basic For Applications窗口
'选择“插入(I)”的子菜单“用户窗体(U)”
'在窗体中放置两个文本框TextBox1、TextBox2;两个单选OptionButton1、OptionButton2;一个按钮CommandButton1
'按钮响应事件执行,生成1×N乘法数
测试样表已打包上传https://download.csdn.net/download/Check_Const/87245479
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 Then
      KeyAscii = 0   '文本框限制输入整数
   End If
End Sub
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
   If KeyAscii < 48 Or KeyAscii > 57 Then
      KeyAscii = 0   '文本框限制输入整数
   End If
End Sub

Private Sub CommandButton1_Click()
   Application.ScreenUpdating = False   '暂停刷新

   If Val(TextBox1.Text) < 1 Or Val(TextBox1.Text) > 250 _
      Or Val(TextBox2.Text) < 1 Or Val(TextBox2.Text) > 250 Then
      
      '控制新数列的数量
      MsgBox "输入数值不能小于1或者大于250", vbExclamation, "提示"
      Exit Sub
   End If

   Dim v_SheetA As Integer, v_SheetB As Integer  '工作表编号
   Dim v_minN As Integer, v_maxN As Integer
   Dim Row_Start As Integer
   Dim Col_Start As Integer
   
   v_SheetA = 1  '工作表Sheet1
   v_SheetB = 2  '工作表Sheet2
   
   If MsgBox("即将清空工作表" & v_SheetA & "、" & v_SheetB & ",是否继续?", vbYesNo + vbQuestion, "提示") = 7 Then
      Exit Sub
   End If
   
   'Sheets(v_SheetA).Columns.ClearFormats  '清除格式
   Sheets(v_SheetA).Columns.Clear         '初始化清空内容
   Sheets(v_SheetA).Rows.UseStandardHeight = True   '恢复标准行高
   Sheets(v_SheetA).Columns.UseStandardWidth = True '恢复标准列宽
   'Sheets(v_SheetB).Columns.ClearFormats
   Sheets(v_SheetB).Columns.Clear
   Sheets(v_SheetB).Rows.UseStandardHeight = True   '恢复标准行高
   Sheets(v_SheetB).Columns.UseStandardWidth = True '恢复标准列宽
   
   
   'v_minN × v_maxN =?   '公式
   v_minN = Val(TextBox1.Text)   '始数
   v_maxN = Val(TextBox2.Text)   '止数
   
   Sheets(v_SheetA).Activate
   Sheets(v_SheetA).Cells(1, 1).Value = "乘法公式"

   Row_Start = 2   '始行 填写位置
   Col_Start = 2   '始列
   Cells(Row_Start, Col_Start).Value = "序号"

   With Workbooks(v_SheetA).ActiveSheet
      For i = v_minN To v_maxN
      .Cells(Row_Start + i, Col_Start).Value = i               '行序号
      .Cells(Row_Start + i, Col_Start).Interior.Color = 65535  '填充颜色
         For j = v_minN To v_maxN
            .Cells(Row_Start, Col_Start + j).Value = j               '列序号
            .Cells(Row_Start, Col_Start + j).Interior.Color = 65535  '填充颜色
            .Cells(Row_Start + i, Col_Start + j).Value = i & "×" & j & "=" & i * j '乘法公式
         Next j
      Next i

      '区域1
      'ActiveSheet.Range(Cells(Row_Start, Col_Start), Cells(Row_Start + v_maxN, Col_Start + v_maxN)).Select
      .Range(Cells(Row_Start, Col_Start), Cells(Row_Start + v_maxN, Col_Start + v_maxN)).Select
   
     '单元格格式
      'Selection.Font.Name = "宋体"
      Selection.Font.Size = 9   '字体大小
      Selection.VerticalAlignment = xlVAlignCenter   '垂直居中
      Selection.Borders.LineStyle = xlContinuous     '边框实线
      Selection.EntireColumn.AutoFit                 '列宽
      .Rows(Col_Start).HorizontalAlignment = xlHAlignCenter     '水平居中 行设置方式
      .Columns(Col_Start).HorizontalAlignment = xlHAlignCenter  '水平居中
   End With

   If OptionButton1.Value = True Then   '保存工作表1
      Row_Start = v_maxN + 5   '数值形式 始行号
      With Workbooks(v_SheetA).ActiveSheet
         .Cells(Row_Start - 1, 1).Value = "数值形式"
         .Cells(Row_Start, Col_Start).Value = "序号"

         For i = v_minN To v_maxN
            .Cells(Row_Start + i, Col_Start).Value = i               '行序号
            .Cells(Row_Start + i, Col_Start).Interior.Color = 65535  '填充颜色
            For j = v_minN To v_maxN
               .Cells(Row_Start, Col_Start + j).Value = j               '列序号
               .Cells(Row_Start, Col_Start + j).Interior.Color = 65535  '填充颜色
               .Cells(Row_Start + i, Col_Start + j).Value = i * j '乘法结果
            Next j
         Next i
    
         '区域2
         .Range(Cells(Row_Start, Col_Start), Cells(Row_Start + v_maxN, Col_Start + v_maxN)).Select
          Selection.Font.Size = 9   '字体大小
          Selection.HorizontalAlignment = xlHAlignCenter '水平居中
          Selection.VerticalAlignment = xlVAlignCenter   '垂直居中
          Selection.Borders.LineStyle = xlContinuous     '边框实线
    
          .PageSetup.Orientation = xlLandscape   '纸张方向:横向
          .Cells(1, 2).Select
       End With

       MsgBox "已生成 " & v_minN & "×" & v_maxN & " 数据", vbInformation, "提示"
   Else
      '数值填写工作表2
      Sheets(v_SheetB).Activate  '切换
      With Sheets(v_SheetB)
         .Cells(1, 1).Value = "数值形式"
         .Cells(Row_Start, Col_Start).Value = "序号"
      
         For i = v_minN To v_maxN
            .Cells(Row_Start + i, Col_Start).Value = i               '行序号
            .Cells(Row_Start + i, Col_Start).Interior.Color = 65535  '填充颜色
            For j = v_minN To v_maxN
               .Cells(Row_Start, Col_Start + j).Value = j               '列序号
               .Cells(Row_Start, Col_Start + j).Interior.Color = 65535  '填充颜色
               .Cells(Row_Start + i, Col_Start + j).Value = i * j '乘法结果
            Next j
         Next i
      End With
    
      '区域格式
      Sheets(v_SheetB).Range(Cells(Row_Start, Col_Start), Cells(Row_Start + v_maxN, Col_Start + v_maxN)).Select
      Selection.Font.Size = 9   '字体大小
      Selection.HorizontalAlignment = xlHAlignCenter '水平居中
      Selection.VerticalAlignment = xlVAlignCenter   '垂直居中
      Selection.Borders.LineStyle = xlContinuous     '边框实线
      Selection.EntireColumn.AutoFit                 '列宽

      Sheets(v_SheetB).PageSetup.Orientation = xlLandscape   '纸张方向:横向
      Sheets(v_SheetB).Cells(2, 1).Select
      MsgBox "已生成 " & v_minN & "×" & v_maxN & " 数据,其中数值形式保存于工作表2", vbInformation, "提示"
   End If

   Application.ScreenUpdating = True   '恢复刷新
End Sub

img

img

img

回答问题 2022.12.05

EXCEL VBA生成1×N乘法数据源代码

发布资源 2022.12.05 ·

sql 时间计算问题

答:
select 工作人员编号,进出货标志,组,
case when "间隔时间(小时)_用秒参数"=0 then '0'
     else cast("间隔时间(小时)_用秒参数" as varchar)
     end "间隔时间(小时)_用秒参数",
case when "间隔时间(小时)_用分钟参数"=0 then '0'
     else cast("间隔时间(小时)_用分钟参数" as varchar)
     end "间隔时间(小时)_用分钟参数"
from
(
    select 工作人员编号,进出货标志,组,
    --用相差秒转换精度好像更高一点
    Convert(decimal(15,8),datediff(second,min(交易时间),max(交易时间)))/3600 as "间隔时间(小时)_用秒参数",
    Convert(decimal(15,8),datediff(minute,min(交易时间),max(交易时间)))/60 as "间隔时间(小时)_用分钟参数"
    from
    (  --模拟数据
       select '436742123' 工作人员编号,'出' 进出货标志,'2022/11/20 11:24:33' 交易时间,255 组,1 出货次序
       union all
       select '436742123' 工作人员编号,'出' 进出货标志,'2022/11/21 08:49:11' 交易时间,255 组,2 出货次序
       union all
       select '436742123' 工作人员编号,'出' 进出货标志,'2022/11/21 11:14:37' 交易时间,255 组,3 出货次序
       union all
       select '436742123' 工作人员编号,'进' 进出货标志,'2022/11/21 11:37:41' 交易时间,226 组,1 出货次序
       union all
       select '436742123' 工作人员编号,'进' 进出货标志,'2022/11/21 11:41:16' 交易时间,227 组,1 出货次序
       union all
       select '436742123' 工作人员编号,'进' 进出货标志,'2022/11/21 12:48:52' 交易时间,228 组,1 出货次序
       union all
       select '436742123' 工作人员编号,'出' 进出货标志,'2022/11/21 15:27:57' 交易时间,229 组,1 出货次序
       union all
       select '436742123' 工作人员编号,'出' 进出货标志,'2022/11/21 16:10:15' 交易时间,229 组,2 出货次序
       -- ...
    ) t
    group by 工作人员编号,进出货标志,组
) t
order by 工作人员编号,组

img

回答问题 2022.12.05

如何向sql server 指定记录前添加数据

答:
这位同学的目的是什么?
假设有一字段“vNo”,在创建表时设为自增列“vNo bigint identity(1, 1)”后,其所有顺序规则已定,新插入记录的vNo均按原基础序号+1。
在SQL Server 测试:
Create table Temp_CheckTName
(
   vNo bigint identity (1, 1) not null,
   TestName varchar(50) not null
   constraint PK_Temp_CheckTName primary key clustered
   (
     vNO ASC  --主键
   )
) --on Check_Data  --测试文件组
go

--插入测试数据
insert into Temp_CheckTName (TestName)
values('测试1'),('测试2'),('测试3'),('测试4'),('测试5'),
('测试6'),('测试7'),('测试8'),('测试9')
其“vNo”对应顺序号为1至9

若试执行“update Temp_CheckTName set vNo=7 where vNo=7;”,将提示“无法更新标识列 'vNo'。”
说明自增序列不接受update操作。

若执行删除一条记录“delete Temp_CheckTName where vNo=9”
再插入一条“insert into Temp_CheckTName (TestName) values('测试n')”
此时虽然是9行数据,但“测试n”的“vNo”对应值为“10”,说明不受delete操作影响。

如果非要新增一条“vNo=6”,为了以后查询排序?在数据量不多的前提下,可以变通一下:
1. 将原数据先导出至另一表#Temp_CheckTName_mid。
2. 清除原表Temp_CheckTName对应记录。
3. 将记录插回Temp_CheckTName。

当原表非空且新记录与主键不冲突,手工插入先设 set indentity_insert Temp_CheckTName on
假设之前执行过删除“delete Temp_CheckTName where vNo=6”,再插回一条“vNo”为6的记录
set indentity_insert Temp_CheckTName on
insert into Temp_CheckTName (vNo, TestName) values(6, '测试6')
set indentity_insert Temp_CheckTName off
回答问题 2022.12.04

EXCEL VBA复制含公式数据源替换为数值

EXCEL VBA复制含公式数据源替换为数值
原创
发布博客 2022.12.01 ·
4530 阅读 ·
0 点赞 ·
2 评论 ·
10 收藏

查询某文件夹下所有EXCEL表格文件工作表行数和列数等信息

查询某文件夹下所有EXCEL表格文件工作表行数和列数等信息,辅助其他功能需求处理
原创
发布博客 2022.11.30 ·
910 阅读 ·
0 点赞 ·
1 评论 ·
1 收藏

EXCEL VBA 对话框MsgBox语法笔记

EXCEL VBA 对话框MsgBox语法
原创
发布博客 2022.11.30 ·
1279 阅读 ·
0 点赞 ·
1 评论 ·
2 收藏

一个SQLServer问题

答:

很基础的查询统计,但描述欠详细不严谨
1. 未给出数据库中表及字段命名。
2. “超过60分”按字面是不包含60分。

若以截图下方表格理解,考核通过条件是:
case when FR得分>60 and SQL得分>60 and TOMAT得分>60
     and FR得分+SQL得分+TOMAT得分+Kettle得分>240 then '考核通过'
     else '考核未通过' end 考核结果

假设截图下方表格名称为Test_Exam
1)查询结果输出人员姓名、考核次数、考核通过次数、考核通过率
select 人员姓名,
count(*) 考核次数,  --这儿“count(*)”可写为sum(1)或者count(1)
sum(case when 考核结果='考核通过' then 1 else 0 end) 考核通过次数,
sum(case when 考核结果='考核通过' then 1 else 0 end)*1.0/count(*) 考核通过率
from Test_Exam
group by 人员姓名

或者
select t.*, 考核通过次数*1.0/考核次数 as 考核通过率
from
(
   select 人员姓名, sum(1) 考核次数,
   sum(case when 考核结果='考核通过' then 1 else 0 end) 考核通过次数
   from Test_Exam
   group by 人员姓名
) t
--说明:当“/”表示整除时,用“*1.0”相当于转换float,如“cast(考核通过次数 as float)”


--总体考核次数、考核通过次数、考核通过率
select 总考核次数,总考核通过次数,
总考核通过次数*1.0/总考核次数 as 总考核通过率
from
(
   select sum(1) 总考核次数,
   sum(case when 考核结果='考核通过' then 1 else 0 end) 总考核通过次数
   from Test_Exam
) t

2)查询多次考核总分的平均分>=250的人员姓名、考核平均分
--这个的“多次”若指为某个人参加考试>=2次,为何不描述“2次或以上”?

   select 人员姓名, sum(FR得分+SQL得分+TOMAT得分+Kettle得分)/sum(1) 考核平均分
   --sum(1) as 考核次数,
   --sum(FR得分+SQL得分+TOMAT得分+Kettle得分) as 总分
   from Test_Exam
   group by 人员姓名
   having sum(1)>1  --2次或以上
   and sum(FR得分+SQL得分+TOMAT得分+Kettle得分)/sum(1)>=250

--平均分采用整除

或者
select 人员姓名, --考核次数, --题中没要求显示考核次数
总分/考核次数 as 考核平均分
from
(
   select 人员姓名, sum(1) as 考核次数,
   sum(FR得分+SQL得分+TOMAT得分+Kettle得分) as 总分
   from Test_Exam
   group by 人员姓名
) t
where 考核次数>1 and 总分/考核次数>=250

3)若通过一次考核视为人员考核通过,若考核通过则输出考核通过中总分最高的记录;若考核未通过则输出考核未通过中总分最高的记录,结果输出:人员姓名、考核结果、FR得分、SQL得分、TOMCAT得分、kettle得分、考核时间
--若同一人多次考试有多条相同的“总分最高”是不是也显示?
--输出结果有分项得分,却不显示总分?实际应用一般有合计项

假设:
(1)可能存在“考核未通过的总分”大于或等于“考核通过的总分”的记录。
(2)可能同一个考核通过人员有“通过”和“未通过”两种记录。
(3)按人员分组查询,而不是只查总体那条“总分最高的记录”。

查询方法多种多样,其中之一如下:
select * from Test_Exam as T1
where exists 
(
   --考核通过中总分最高的记录
   select 1 from
   (
      select 人员姓名, 考核结果, --sum(1) as 考核次数,
      sum(case when 考核结果='考核通过' then 1 else 0 end) 考核通过次数,
      sum(case when 考核结果='考核未通过' then 1 else 0 end) 考核未通过次数,
      max(FR得分+SQL得分+TOMAT得分+Kettle得分) 最高总分
      from Test_Exam
      group by 人员姓名, 考核结果
   ) as T2
   where T1.人员姓名=T2.人员姓名
   and T1.考核结果=T2.考核结果
   and 
   (
     (T2.考核通过次数>=1 and T2.考核结果='考核通过') 
     or T2.考核通过次数=0 --(T2.考核通过次数=0 and T2.考核结果='考核未通过')
   )
   and T1.FR得分+T1.SQL得分+T1.TOMAT得分+T1.Kettle得分=T2.最高总分
)

回答问题 2022.11.30

Word2019调整段落的小窗口如何缩小

答:

尝试调整小点显示器分辨率看看

回答问题 2022.11.29

如何使用sql统计相邻不大于30分钟的组合出现的次数。

答:
描述好像有点笼统,例如:
“2022/11/23 00:50:00”与“2022/11/23 01:00:00”
“2022/11/23 01:53:37”与“2022/11/23 02:00:25”
“2022/11/23 13:01:15”与“2022/11/23 13:10:18”
“2022/11/23 14:20:00”与“2022/11/23 14:22:31”
这些不是相隔小于30分钟吗?

假设数据表名称为Temp_Check,且原没有另外顺序号列

select 
ROW_NUMBER()OVER(order by 会员号 ASC,射击时间 ASC) as RowNum, --增加顺序号
会员号,射击时间,是否中靶
into #Temp_Check_Mid  --暂存中间表1
from Temp_Check
GO

--创建索引
Create index IDX_Temp_Check_Mid_OperatorNo on #Temp_Check_Mid(会员号); --on Test_Data --测试文件组
Create index IDX_Temp_Check_Mid_RowNum on #Temp_Check_Mid(RowNum);
Create index IDX_Temp_Check_Mid_Time on #Temp_Check_Mid(射击时间);
GO

--查询测试
--1. 提取相邻中靶记录
select * into #Temp_Check_Mid2  --暂存中间表2
from #Temp_Check_Mid T1
where T1.是否中靶='是'
and exists 
(
   select 1 from #Temp_Check_Mid T2
   where T1.会员号=T2.会员号
   and ABS(T1.RowNum-T2.RowNum)=1  --序号相邻
   and T2.射击时间 between DATEADD(second,-1800,T1.射击时间) --30分钟=1800秒
                  and DATEADD(second,1800,T1.射击时间)
   and T1.是否中靶=T2.是否中靶  --或者 T2.是否中靶='是'
)
GO

--2. 使用游标(或其他)顺序读取中间表#Temp_Check_Mid2,若出现顺序号不连续时,次数加1
回答问题 2022.11.29

如何使用sql统计相邻不大于30分钟的组合出现的次数。

答:
描述好像有点笼统,例如:
“2022/11/23 00:50:00”与“2022/11/23 01:00:00”
“2022/11/23 01:53:37”与“2022/11/23 02:00:25”
“2022/11/23 13:01:15”与“2022/11/23 13:10:18”
“2022/11/23 14:20:00”与“2022/11/23 14:22:31”
这些不是相隔小于30分钟吗?

假设数据表名称为Temp_Check,且原没有另外顺序号列

select 
ROW_NUMBER()OVER(order by 会员号 ASC,射击时间 ASC) as RowNum, --增加顺序号
会员号,射击时间,是否中靶
from Temp_Check
into #Temp_Check_Mid  --暂存中间表1
GO

--创建索引
Create index IDX_Temp_Check_Mid_OperatorNo on #Temp_Check_Mid(会员号); --on Test_Data --测试文件组
Create index IDX_Temp_Check_Mid_RowNum on #Temp_Check_Mid(RowNum);
Create index IDX_Temp_Check_Mid_Time on #Temp_Check_Mid(射击时间);
GO

--查询测试
--1. 提取相邻中靶记录
select * into #Temp_Check_Mid2  --暂存中间表2
from #Temp_Check_Mid T1
where T1.是否中靶='是'
and exists 
(
   select 1 from #Temp_Check_Mid T2
   where T1.会员号=T2.会员号
   and ABS(T1.RowNum-T2.RowNum)=1  --序号相邻
   and T2.射击时间 between DATEADD(second,-1800,T1.射击时间) --30分钟=1800秒
                  and DATEADD(second,1800,T1.射击时间)
   and T1.是否中靶=T2.是否中靶  --或者 T2.是否中靶='是'
)

--2. 使用游标(或其他)顺序读取中间表#Temp_Check_Mid2,若出现顺序号不连续时,次数加1
回答问题 2022.11.29

如何使用sql统计相邻不大于30分钟的组合出现的次数。

答:
描述好像有点笼统,例如:
“2022/11/23 00:50:00”与“2022/11/23 01:00:00”
“2022/11/23 01:53:37”与“2022/11/23 02:00:25”
“2022/11/23 13:01:15”与“2022/11/23 13:10:18”
“2022/11/23 14:20:00”与“2022/11/23 14:22:31”
这些不是相隔小于30分钟吗?

假设数据表名称为Temp_Check,且原没有另外顺序号列

select 
ROW_NUMBER()OVER(order by 会员号 ASC,射击时间 ASC) as RowNum, --增加顺序号
会员号,射击时间,是否中靶
into #Temp_Check_Mid  --暂存中间表1
GO

--创建索引
Create index IDX_Temp_Check_Mid_OperatorNo on #Temp_Check_Mid(会员号); --on Test_Data --测试文件组
Create index IDX_Temp_Check_Mid_RowNum on #Temp_Check_Mid(RowNum);
Create index IDX_Temp_Check_Mid_Time on #Temp_Check_Mid(射击时间);
GO

--查询测试
--1. 提取相邻中靶记录
select * into #Temp_Check_Mid2  --暂存中间表2
from #Temp_Check_Mid T1
where T1.是否中靶='是'
and exists 
(
   select 1 from #Temp_Check_Mid T2
   where T1.会员号=T2.会员号
   and ABS(T1.RowNum-T2.RowNum)=1  --序号相邻
   and T2.射击时间 between DATEADD(second,-1800,T1.射击时间) --30分钟=1800秒
                  and DATEADD(second,1800,T1.射击时间)
   and T1.是否中靶=T2.是否中靶  --或者 T2.是否中靶='是'
)

--2. 使用游标(或其他)顺序读取中间表#Temp_Check_Mid2,若出现顺序号不连续时,次数加1
回答问题 2022.11.29

检索带order by 非常慢

答:

--数据超千万过亿时,若非必要一般不写“*”所有字段
--若表有200个字段,需求只返回其中6个字段,建议写对应字段就可以了
--若“OFFSET 0”等阶于没有OFFSET子句,可不写
--大表order by 排序耗资源,可以分表查询后再对中间数据排序

方式一:
select * FROM
(
   SELECT create_time,code,写段3,写段4,写段5,写段6
   FROM 20221127表1
   UNION ALL
   SELECT create_time,code,写段3,写段4,写段5,写段6 
   FROM 20221128表2
   UNION ALL
   SELECT create_time,code,写段3,写段4,写段5,写段6 
   FROM t20221130表3
) AS t
where code = 'AAAA'
AND create_time between '2022-11-16 00:00:00' AND '2022-11-27 00:00:00'
order by create_time desc
LIMIT 10

方式二:
select * FROM
(
   SELECT create_time,code,写段3,写段4,写段5,写段6
   FROM 20221127表1
   where code = 'AAAA'
   AND create_time between '2022-11-16' AND '2022-11-27'

   UNION ALL
   SELECT create_time,code,写段3,写段4,写段5,写段6 
   FROM 20221128表2
   where code = 'AAAA'
   AND create_time between '2022-11-16' AND '2022-11-27'

   UNION ALL
   SELECT create_time,code,写段3,写段4,写段5,写段6 
   FROM t20221130表3
   where code = 'AAAA'
   AND create_time between '2022-11-16' AND '2022-11-27'
) AS t
order by create_time desc
LIMIT 10

方式三:
--尝试对方式二创建查询过程,传递构建字符串,用execute执行
--构造逻辑:
(
   v_date1 varchar(20),  --始create_time
   v_date2 varchar(20),  --止create_time
   v_code varchar(50)    --code
)
declare v_SQLstr text;
begin
   select 'SELECT create_time,code,写段3,写段4,写段5,写段6 FROM 20221127表1 '
     ||' where code = '''||v_code'''
     ||' and create_time between '''||v_date1||'''||' and '''||v_date2||'''
     ||' UNION ALL'
     'SELECT create_time,code,写段3,写段4,写段5,写段6 FROM 20221127表2 '
     ||' where code = '''||v_code'''
     ||' and create_time between '''||v_date1||'''||' and '''||v_date2||'''
     ||' UNION ALL'
     'SELECT create_time,code,写段3,写段4,写段5,写段6 FROM 20221127表2 '
     ||' where code = '''||v_code'''
     ||' and create_time between '''||v_date1||'''||' and '''||v_date2||'''
   || $1 into v_SQLstr ;

   execute v_SQLstr;
   
end

回答问题 2022.11.29

VBA 复制一个EXCEL文件某列至另一个文件

对应提问VBA怎么把工作簿A中的第N列,复制到工作簿B中的第N列。https://ask.csdn.net/questions/7846408/53999954?spm=1001.2014.3001.5501
转载
发布博客 2022.11.28 ·
6298 阅读 ·
3 点赞 ·
1 评论 ·
25 收藏

VBA怎么把工作簿A中的第N列,复制到工作簿B中的第N列。

答:

好像需求描述还有些二义,例如是整列覆盖?还是在目标表对应列最后一行追加?
是两个独立表格文件两个“工作簿”?
还是可以理解为同一个文件(工作簿)中的两个不同“工作表”?
有没有需指定“工作表”中Sheet?

假设两个独立EXCEL表格文件(工作簿)的工作表均为Sheet1
可以参考如下代码(在MS Office Excel测试通过)按实际需求进一步调整

Sub copy_AToB()
   Dim Wbook1 As Workbook, Wbook2 As Workbook
   Dim path_A, path_B
   Dim ABookName, BBookName   '假设两个独立表格文件
   Dim aCol As Integer, bCol As Integer
   
   Application.ScreenUpdating = False  '暂停刷新

   path_A = "D:\"
   ABookName = "checkA.xlsx"   'A表格文件名称
   
   path_B = "E:\"
   BBookName = "checkB.xlsx"   'B表格文件名称
   aCol = 3   'A表格的源列号 按需求灵活调整
   bCol = 6   'B表格的目标列号
   
   If ABookName = BBookName Then
      MsgBox "两个文件名称不能相同", vbInformation, "提示"
      Exit Sub  ‘若不符合逻辑则退出
   End If
   
   ABookName = path_A & ABookName  '加路径组合
   BBookName = path_B & BBookName
   
   If Dir(ABookName, 16) = vbNullString Then  '检查文件是否存在
      MsgBox "未找到 " & ABookName, vbInformation, "提示"
      Exit Sub
   End If
   
   If Dir(BBookName, 16) = vbNullString Then
      MsgBox "未找到 " & BBookName, vbInformation, "提示"
      Exit Sub
   End If
   '文件存在的条件为 Not Dir(ABookName, 16) = vbNullString
   
   
      Set Wbook1 = Workbooks.Open(ABookName)  '打开A文件
      Set Wbook2 = Workbooks.Open(BBookName)  '打开B文件
      Wbook1.Sheets(1).Activate
      ActiveSheet.Columns(aCol).Copy  '复制列
      
      Wbook2.Sheets(1).Activate
      ActiveSheet.Columns(bCol).PasteSpecial  '拷贝至目标列
      
      '清空剪贴板,避免关闭文件命令时弹出提示类似“在剪贴板上有大量信息。是否保留其内容,以便此后粘贴到其他程序中?”
      Application.CutCopyMode = False '清空
      
      Wbook1.Close  '关闭A文件
      
      Wbook2.Save   '保存B文件
      'Wbook2.SaveAs Filename:="E:\checkB_New.xlsx"  '此句测试另存为新文件
      Wbook2.Close  '关闭B文件
      
      MsgBox "从" & ABookName & "拷贝至" & BBookName & "完成", vbInformation, "提示"

   
   Application.ScreenUpdating = True

End Sub
回答问题 2022.11.27

EXCEL按列进行拆分

答:

有多种实现方式,其中方式之一:

  1. 查询当前表格行数量和列数量。
  2. 新建sheet(或者表格文件Workbooks)
    (1)从截图H列至最后一列,为将新建sheet的数量,每个名称自定义规则。
    修改sheet名称参考:Sheets(2).Name = Sheets(1).Cells(1, 8).Value 【表示第2个sheet名称修改为第1个工作表的第1行第8列单元格相同内容】
    (2)读取原表保留公共列及后面对应单列内容填写至各个新sheet。
回答问题 2022.11.27

Excel函数公式的选择

答:

一、选择单元格(样表暂放B列)输入如下基础数据,为后续计算调取和变更
1.年工资增长比例 2% 【样表位置B3】
2.(从工资中抽取)每年交退休金比例 6% 【样表位置B4】
3.退休金的年回报率 4% 【样表位置B5】
4.当前年的工资金额(元) 10000 【样表位置B6】
5.原已有退休基金(元) 50000 【样表位置B7】

二、设计计算表格
1.序号1行
(1)“年工资(元)”的单元格F3输入公式 =B6

(2)“每年交的金额(元)”的单元格G3输入公式 =F3*$B$4
说明:每年交的金额(元)=年工资(元)×每年交退休金比例,其中对单元格“B4”使用“$”符定位写为“$B$4”,后续下拉公式时保持取该单元格数值。

(3)“累计交的金额(元)”的单元格H3输入公式 =B7+G3
说明:累计交的金额(元)=原已有退休基金(元)+每年交的金额(元)。

(4)“每年回报数额”的单元格I3输入公式 =H3*$B$5
说明:每年回报数额=累计交的金额(元)×退休金的年回报率。由用户根据实际规则调整计算逻辑,样本仅展示表格公式设置方式而已。

(5)“回报累计数额”的单元格J3输入公式 =I3
说明:第一行假设之前数为0,故“回报累计数额”直接等于前列“每年回报数额”。

2.序号2行
(1)“年龄”的单元格E4输入公式 =E3+1
(2)“年工资(元)”的单元格F4输入公式 =F3+F3*$B$3 或者 =F3*(1+$B$3)
(3)“每年交的金额(元)”的单元格G4输入公式 =F4*$B$4
(4)“累计交的金额(元)”的单元格H4输入公式 =H3+G4
(5)“每年回报数额”的单元格I4输入公式 =H4*$B$5
(6)“回报累计数额”的单元格J4输入公式 =J3+I4

3.前1、2行设置公式后,鼠标拉选从序号2行的E4单元格选择至J4,往下复制至最后序号行。

展示单元格公式

img

模拟效果

img

回答问题 2022.11.27
加载更多