Mssql按数据类型分组,大牛来指点一二

mir521585 2017-09-28 11:17:25
一共四张表,下方是表结构和相关数据
DATA_BIAO
CREATE TABLE [dbo].[Data_biao] (
[DJ_Date] datetime NULL DEFAULT (getdate()) ,
[DJ_Number] varchar(15) NOT NULL ,
[CheckDate] varchar(10) NULL ,
[GxID] varchar(10) NULL ,
[Info1] varchar(20) NULL ,
[Info2] varchar(20) NULL ,
[Info3] varchar(20) NULL ,
[Info4] varchar(20) NULL ,
[BZ] varchar(20) NULL ,
[LB] varchar(10) NULL ,
[JH_Money] decimal(18,2) NULL ,
[SJ_Money] decimal(18,2) NULL
)

GO

-- ----------------------------
-- Records of Data_biao
-- ----------------------------
INSERT INTO [dbo].[Data_biao] ([DJ_Date], [DJ_Number], [CheckDate], [GxID], [Info1], [Info2], [Info3], [Info4], [BZ], [LB], [JH_Money], [SJ_Money]) VALUES (N'2017-09-28 22:46:33.143', N'CK20170001', N'2017-09-28', N'001001', N'1', N'2', null, null, null, N'出库', N'176990.00', null)
GO
GO
INSERT INTO [dbo].[Data_biao] ([DJ_Date], [DJ_Number], [CheckDate], [GxID], [Info1], [Info2], [Info3], [Info4], [BZ], [LB], [JH_Money], [SJ_Money]) VALUES (N'2017-09-28 22:45:17.163', N'RK20170001', N'2017-09-28', N'001', N'1', N'2', N'', null, N'3', N'入库', N'120900.00', N'65900.00')
GO
GO
INSERT INTO [dbo].[Data_biao] ([DJ_Date], [DJ_Number], [CheckDate], [GxID], [Info1], [Info2], [Info3], [Info4], [BZ], [LB], [JH_Money], [SJ_Money]) VALUES (N'2017-09-28 22:45:54.500', N'RK20170002', N'2017-09-28', N'001', N'2', N'3', N'', null, N'4', N'入库', N'37400.00', N'12400.00')
GO
GO

-- ----------------------------
-- Indexes structure for table Data_biao
-- ----------------------------
CREATE INDEX [_WA_Sys_GxID_1FCDBCEB] ON [dbo].[Data_biao]
([GxID] ASC)
GO
CREATE INDEX [_WA_Sys_LB_1FCDBCEB] ON [dbo].[Data_biao]
([LB] ASC)
GO
CREATE INDEX [_WA_Sys_DJ_Date_1FCDBCEB] ON [dbo].[Data_biao]
([DJ_Date] ASC)
GO
CREATE INDEX [_WA_Sys_CheckDate_1FCDBCEB] ON [dbo].[Data_biao]
([CheckDate] ASC)
GO

-- ----------------------------
-- Primary Key structure for table Data_biao
-- ----------------------------
ALTER TABLE [dbo].[Data_biao] ADD PRIMARY KEY ([DJ_Number])
GO


DATA_LOG
CREATE TABLE [dbo].[Data_Log] (
[DJ_Number] varchar(15) NULL ,
[CL_Code] varchar(20) NULL ,
[SL] decimal(18,4) NULL ,
[SJ_Price] decimal(18,6) NULL ,
[SJ_Money] decimal(18,2) NULL ,
[JH_Price] decimal(18,6) NULL ,
[JH_Money] decimal(18,2) NULL ,
[SX] int NULL ,
[BZ] varchar(20) NULL ,
[Info] varchar(20) NULL ,
[ID] int NOT NULL IDENTITY(1,1)
)


GO

-- ----------------------------
-- Records of Data_Log
-- ----------------------------
SET IDENTITY_INSERT [dbo].[Data_Log] ON
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170001', N'0101110155012', N'10.0000', N'2000.000000', N'20000.00', N'2500.000000', N'25000.00', N'1', null, null, N'80')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170001', N'0101110171038', N'20.0000', N'1740.000000', N'34800.00', N'2740.000000', N'54800.00', N'2', null, null, N'81')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170001', N'0101110175043', N'30.0000', N'370.000000', N'11100.00', N'1370.000000', N'41100.00', N'3', null, null, N'82')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170002', N'0101110171038', N'10.0000', N'740.000000', N'7400.00', N'2740.000000', N'27400.00', N'1', null, null, N'83')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170002', N'0000000000002', N'10.0000', N'500.000000', N'5000.00', N'1000.000000', N'10000.00', N'2', null, null, N'84')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'CK20170001', N'0101110155012', N'11.0000', null, null, N'2500.000000', N'27500.00', N'1', null, null, N'85')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'CK20170001', N'0101110171038', N'22.0000', null, null, N'2740.000000', N'60280.00', N'2', null, null, N'86')
GO
GO


CL_DICT
CREATE TABLE [dbo].[CL_Dict] (
[Cl_Code] varchar(20) NOT NULL ,
[Name] varchar(40) NULL ,
[Type] varchar(40) NULL ,
[Dw] varchar(15) NULL ,
[LB_Code] varchar(15) NOT NULL ,
[InputPY] varchar(10) NULL ,
[Price] decimal(18,6) NULL DEFAULT (0) ,
[QCSl] decimal(18,4) NULL DEFAULT (0) ,
[QCje] decimal(18,2) NULL DEFAULT (0) ,
[Bz] varchar(20) NULL ,
[Rksl] decimal(18,4) NULL DEFAULT (0) ,
[Cksl] decimal(18,4) NULL DEFAULT (0)
)


-- ----------------------------
-- Records of CL_Dict
-- ----------------------------
INSERT INTO [dbo].[CL_Dict] ([Cl_Code], [Name], [Type], [Dw], [LB_Code], [InputPY], [Price], [QCSl], [QCje], [Bz], [Rksl], [Cksl]) VALUES (N'0000000000002', N'多用', N'test', N'克', N'002', null, N'1000.000000', N'10.0000', N'10000.00', null, N'10.0000', N'44.0000')
GO
GO
INSERT INTO [dbo].[CL_Dict] ([Cl_Code], [Name], [Type], [Dw], [LB_Code], [InputPY], [Price], [QCSl], [QCje], [Bz], [Rksl], [Cksl]) VALUES (N'0101110155012', N'轻轨', N'50-55Q 12kg', N'吨', N'001', N'', N'2500.000000', N'10.0000', N'25000.00', N'', N'10.0000', N'11.0000')
GO
GO
INSERT INTO [dbo].[CL_Dict] ([Cl_Code], [Name], [Type], [Dw], [LB_Code], [InputPY], [Price], [QCSl], [QCje], [Bz], [Rksl], [Cksl]) VALUES (N'0101110171038', N'重轨', N'U71-74 38kg', N'吨', N'001', N'', N'2740.000000', N'1.0000', N'2740.00', null, N'30.0000', N'22.0000')
GO
GO
INSERT INTO [dbo].[CL_Dict] ([Cl_Code], [Name], [Type], [Dw], [LB_Code], [InputPY], [Price], [QCSl], [QCje], [Bz], [Rksl], [Cksl]) VALUES (N'0101110175043', N'复用轨', N'43kg', N'吨', N'001', N'', N'1370.000000', N'5.0000', N'6850.00', null, N'30.0000', N'33.0000')
GO
GO

-- ----------------------------
-- Indexes structure for table CL_Dict
-- ----------------------------
CREATE INDEX [_WA_Sys_LB_Code_1DE57479] ON [dbo].[CL_Dict]
([LB_Code] ASC)
GO
CREATE INDEX [_WA_Sys_Type_76CBA758] ON [dbo].[CL_Dict]
([Type] ASC)
GO
CREATE INDEX [_WA_Sys_QCSl_76CBA758] ON [dbo].[CL_Dict]
([QCSl] ASC)
GO
CREATE INDEX [_WA_Sys_QCje_76CBA758] ON [dbo].[CL_Dict]
([QCje] ASC)
GO

-- ----------------------------
-- Primary Key structure for table CL_Dict
-- ----------------------------
ALTER TABLE [dbo].[CL_Dict] ADD PRIMARY KEY ([Cl_Code], [LB_Code])
GO


CLLB_DICT

CREATE TABLE [dbo].[CLLB_Dict] (
[LB_Code] varchar(15) NOT NULL ,
[Name] varchar(24) NULL
)


GO

-- ----------------------------
-- Records of CLLB_Dict
-- ----------------------------
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'005', N'二类材料')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'010', N'护品')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'007', N'火工类')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'012', N'矿粉')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'006', N'木材类')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'011', N'配件')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'009', N'三类材料')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'004', N'一类电线电缆')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'002', N'一类非金属')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'003', N'一类机电产品')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'001', N'一类金属')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'008', N'支护坑带')
GO
GO
INSERT INTO [dbo].[CLLB_Dict] ([LB_Code], [Name]) VALUES (N'013', N'租赁坑带')
GO
GO

-- ----------------------------
-- Indexes structure for table CLLB_Dict
-- ----------------------------
CREATE INDEX [_WA_Sys_Name_22AA2996] ON [dbo].[CLLB_Dict]
([Name] ASC)
GO


各表之间关联:
Data_biao与Data_log关联字段为DJ_Number
CLLB_Dict与CL_Dict关联字段为LB_Code
CL_Dict与Data_Log关联字段为CL_Code

问题:
现在想以CLLB_Dict表里的字段LB_Code进行分组查询,查询该字段下的所属CL_Code在Data_log表里JH_Monty值的累计和在Data_biao里存在的单据张数(分为入库和出库两种),在CL_Dict表里QCJe的累计
我用下方的 语句得到的结果不对,返回的期初金额和出入库的单据张数都是错的,总是重复计算了,搞了快一天了,来个大牛指点一下吧,现在只知道是因为Data_log表里CL_code字段值重复的问题,但不知道该如何搞!
SELECT
a.lb_code,
SUM (b.qcje) AS 期初金额,
SUM (CASE WHEN lb = '入库' THEN 1 ELSE 0 END) AS 入库单据张数,
SUM (CASE WHEN lb = '入库' THEN c.jh_money ELSE 0 END) AS 入库金额,
SUM (CASE WHEN lb = '出库' THEN 1 ELSE 0 END) AS 出库单据张数,
SUM (CASE WHEN lb = '出库' THEN c.jh_money ELSE 0 eND) AS 出库金额
FROM
cllb_dict a
left JOIN cl_dict b ON a.lb_code = b.lb_code
LEFT JOIN data_log c ON c.cl_code = b.cl_code
LEFT JOIN data_biao d ON d.dj_number = c.dj_number
and (
(lb = '入库' OR lb = '出库')
AND dj_date BETWEEN '2017-9-01 00:00:00'
AND '2017-9-30 23:59:59'
)
GROUP BY
a.lb_code
ORDER BY
a.lb_code

得到的错误结果

正确结果应该是

麻烦来个大牛指点一下吧!万分感谢!
...全文
327 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mir521585 2017-09-29
  • 打赏
  • 举报
回复
引用 16 楼 appetizing_fish1 的回复:
看来楼主也是个完美主义者
呵呵,只是语句更简单一点,能实现我已经很满足了
听雨停了 2017-09-29
  • 打赏
  • 举报
回复
引用 13 楼 mir521585 的回复:
[quote=引用 12 楼 qq_37170555 的回复:] [quote=引用 11 楼 mir521585 的回复:] 嗯,万发感谢,我按照你的写法自己试一下,
你直接用我的在你的数据库上跑就能出来,不用修改啥[/quote] 嗯,因为还有一些别的条件,我要加上,另外,我对里面一些命令不太理解,我想拆开百度下,[/quote] 那你好好百度下,好好学习下,其实也没啥比较难懂的东西,都是些很基础的语法。不过这么有学习精神不错
顺势而为1 2017-09-29
  • 打赏
  • 举报
回复
看来楼主也是个完美主义者
听雨停了 2017-09-29
  • 打赏
  • 举报
回复
引用 11 楼 mir521585 的回复:
嗯,万发感谢,我按照你的写法自己试一下,
你直接用我的在你的数据库上跑就能出来,不用修改啥
听雨停了 2017-09-29
  • 打赏
  • 举报
回复
引用 9 楼 mir521585 的回复:
[quote=引用 7 楼 z10843087 的回复:] [quote=引用 6 楼 mir521585 的回复:] [quote=引用 5 楼 shoppo0505 的回复:] [Data_log]数据还是不对, 001的入库明明有4比,你却要做成2比,看不懂你的需求。 不再回复。
返回数据要的是材料所属类别的入库张数,data_log表中,入库数据有五条,分别对应两个入库单,第一个入库单有三条数据,这三条数据的cl_code全属于lb_code中的001,第二条入库单有二条数据,一条数据的cl_code属于lb_code中的001,一条数据的cl_code属于lb_code中的002 所以,就对应001两张入库单,002一张入库单[/quote] 帮你看了,现在数字对不上就是:期初金额,入库单据张数,出库单据张数 你说这几个数字的逻辑[/quote] 期初金额,就是LB_code所包含的CL_code在cl_dict表里的qcje的合计 比如,LB_code中001下有四条材料,就是这四条材料的qcje的合计 入库单据张数 比如一个入库单有四条材料,这四条材料有两个属于001 有两个属于002,那么就代表001一个入库单,002一个入库单, 出库单张数和入库单张数计算方式一样 [/quote] 我上面写的这样就可以出来你的需求,试试看
听雨停了 2017-09-29
  • 打赏
  • 举报
回复

;WITH cte AS (
SELECT distinct a.LB_Code,b.qcje,b.Cl_Code,
c.DJ_Number,c.JH_Money,
d.lb
FROM CLLB_Dict a
INNER JOIN CL_Dict b ON a.LB_Code=b.LB_Code
INNER JOIN Data_Log c ON b.Cl_Code=c.CL_Code
INNER JOIN Data_biao d ON c.DJ_Number=d.DJ_Number
),
cte2 AS(
SELECT DISTINCT lb_code,cl_code,qcje FROM cte
),
cte3 AS(
SELECT distinct lb_code,lb,DJ_Number,sum(JH_Money) OVER(PARTITION BY lb_code,lb) AS summoney FROM cte
),
cte4 AS (
SELECT distinct lb_code,lb,
count(1) over(partition by lb_code,lb) AS 单据张数,
summoney AS 金额
FROM cte3
),
cte5 AS (
SELECT DISTINCT LB_Code,SUM(qcje) AS qcje FROM cte2
GROUP BY lb_code
),
cte6 AS(
SELECT a.*,b.qcje FROM cte4 a
INNER JOIN cte5 b ON a.lb_code=b.lb_code
)
SELECT lb_code,
qcje AS 期初金额,
MAX(CASE lb WHEN '入库' THEN 单据张数 ELSE 0 END) 入库单据张数,
MAX(CASE lb WHEN '入库' THEN 金额 ELSE 0 END) 入库金额,
MAX(CASE lb WHEN '出库' THEN 单据张数 ELSE 0 END) 出库单据张数,
MAX(CASE lb WHEN '出库' THEN 金额 ELSE 0 END) 出库金额
FROM cte6
GROUP BY
lb_code,
qcje

mir521585 2017-09-29
  • 打赏
  • 举报
回复
引用 14 楼 qq_37170555 的回复:
[quote=引用 13 楼 mir521585 的回复:] [quote=引用 12 楼 qq_37170555 的回复:] [quote=引用 11 楼 mir521585 的回复:] 嗯,万发感谢,我按照你的写法自己试一下,
你直接用我的在你的数据库上跑就能出来,不用修改啥[/quote] 嗯,因为还有一些别的条件,我要加上,另外,我对里面一些命令不太理解,我想拆开百度下,[/quote] 那你好好百度下,好好学习下,其实也没啥比较难懂的东西,都是些很基础的语法。不过这么有学习精神不错[/quote] 嗯,万分感谢,但还有更简单的语句吗?我用下面的语句,就只有单据张数不对了,就一个单据张数,写那么多语句,有点不甘心
SELECT
    a.lb_code,a.name,
    (select sum( QCje) from CL_Dict where LB_Code = a.LB_Code) AS 期初金额,
    SUM (CASE WHEN lb = '入库' THEN 1  ELSE 0 END) AS 入库单据张数,
    SUM (CASE WHEN lb = '入库' THEN c.jh_money  ELSE 0 END) AS 入库金额,
    SUM (CASE WHEN lb = '出库' THEN 1  ELSE 0 END) AS 出库单据张数,
    SUM (CASE WHEN lb = '出库' THEN c.jh_money  ELSE 0  eND) AS 出库金额,
    (select sum( QCje) from CL_Dict where LB_Code = a.LB_Code)+SUM (CASE WHEN lb = '入库' THEN c.jh_money  ELSE 0 END)-SUM (CASE WHEN lb = '出库' THEN c.jh_money  ELSE 0  eND) as 期未金额
FROM
    cllb_dict a
left JOIN cl_dict b ON a.lb_code = b.lb_code
LEFT JOIN data_log c ON c.cl_code = b.cl_code
LEFT JOIN data_biao d ON d.dj_number = c.dj_number
and (
    (lb = '入库' OR lb = '出库')
    AND dj_date BETWEEN '2017-9-01 00:00:00'
    AND '2017-9-30 23:59:59'
)
GROUP BY
    a.lb_code,a.name
ORDER BY
    a.lb_code
mir521585 2017-09-29
  • 打赏
  • 举报
回复
引用 12 楼 qq_37170555 的回复:
[quote=引用 11 楼 mir521585 的回复:] 嗯,万发感谢,我按照你的写法自己试一下,
你直接用我的在你的数据库上跑就能出来,不用修改啥[/quote] 嗯,因为还有一些别的条件,我要加上,另外,我对里面一些命令不太理解,我想拆开百度下,
shoppo0505 2017-09-29
  • 打赏
  • 举报
回复
[Data_log]数据还是不对, 001的入库明明有4比,你却要做成2比,看不懂你的需求。 不再回复。
mir521585 2017-09-29
  • 打赏
  • 举报
回复
嗯,万发感谢,我按照你的写法自己试一下,
mir521585 2017-09-29
  • 打赏
  • 举报
回复
引用 7 楼 z10843087 的回复:
[quote=引用 6 楼 mir521585 的回复:] [quote=引用 5 楼 shoppo0505 的回复:] [Data_log]数据还是不对, 001的入库明明有4比,你却要做成2比,看不懂你的需求。 不再回复。
返回数据要的是材料所属类别的入库张数,data_log表中,入库数据有五条,分别对应两个入库单,第一个入库单有三条数据,这三条数据的cl_code全属于lb_code中的001,第二条入库单有二条数据,一条数据的cl_code属于lb_code中的001,一条数据的cl_code属于lb_code中的002 所以,就对应001两张入库单,002一张入库单[/quote] 帮你看了,现在数字对不上就是:期初金额,入库单据张数,出库单据张数 你说这几个数字的逻辑[/quote] 期初金额,就是LB_code所包含的CL_code在cl_dict表里的qcje的合计 比如,LB_code中001下有四条材料,就是这四条材料的qcje的合计 入库单据张数 比如一个入库单有四条材料,这四条材料有两个属于001 有两个属于002,那么就代表001一个入库单,002一个入库单, 出库单张数和入库单张数计算方式一样
shoppo0505 2017-09-29
  • 打赏
  • 举报
回复
引用 2 楼 mir521585 的回复:
呼叫呼叫,来个人帮我看看吧,实在搞不动了
你写的代码不对,也不知道你想要得到什么结果. 你看看下面的代码计算期初金额,你的单据数据不对,自己核对一下,然后再添加类似的代码就可以了,. select CLLB_Dict.LB_Code , (select sum( QCje) from CL_Dict where LB_Code = CLLB_Dict.LB_Code) as 期初金额 from CLLB_Dict group by CLLB_Dict.LB_Code
OwenZeng_DBA 2017-09-29
  • 打赏
  • 举报
回复
引用 6 楼 mir521585 的回复:
[quote=引用 5 楼 shoppo0505 的回复:] [Data_log]数据还是不对, 001的入库明明有4比,你却要做成2比,看不懂你的需求。 不再回复。
返回数据要的是材料所属类别的入库张数,data_log表中,入库数据有五条,分别对应两个入库单,第一个入库单有三条数据,这三条数据的cl_code全属于lb_code中的001,第二条入库单有二条数据,一条数据的cl_code属于lb_code中的001,一条数据的cl_code属于lb_code中的002 所以,就对应001两张入库单,002一张入库单[/quote] 帮你看了,现在数字对不上就是:期初金额,入库单据张数,出库单据张数 你说这几个数字的逻辑
mir521585 2017-09-29
  • 打赏
  • 举报
回复
引用 5 楼 shoppo0505 的回复:
[Data_log]数据还是不对, 001的入库明明有4比,你却要做成2比,看不懂你的需求。 不再回复。
返回数据要的是材料所属类别的入库张数,data_log表中,入库数据有五条,分别对应两个入库单,第一个入库单有三条数据,这三条数据的cl_code全属于lb_code中的001,第二条入库单有二条数据,一条数据的cl_code属于lb_code中的001,一条数据的cl_code属于lb_code中的002 所以,就对应001两张入库单,002一张入库单
shoppo0505 2017-09-29
  • 打赏
  • 举报
回复
帮你看了下,数据不对,语句也有问题. 先把表格数据和结果数据对上
mir521585 2017-09-29
  • 打赏
  • 举报
回复
不好意思,上面DATA_LOG表结构和数据创建语句少复制了一部份,下面补上,麻烦大家了 DATA_LOG 结构与数据
CREATE TABLE [dbo].[Data_Log] (
[DJ_Number] varchar(15) NULL ,
[CL_Code] varchar(20) NULL ,
[SL] decimal(18,4) NULL ,
[SJ_Price] decimal(18,6) NULL ,
[SJ_Money] decimal(18,2) NULL ,
[JH_Price] decimal(18,6) NULL ,
[JH_Money] decimal(18,2) NULL ,
[SX] int NULL ,
[BZ] varchar(20) NULL ,
[Info] varchar(20) NULL ,
[ID] int NOT NULL IDENTITY(1,1) 
)


GO

-- ----------------------------
-- Records of Data_Log
-- ----------------------------
SET IDENTITY_INSERT [dbo].[Data_Log] ON
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170001', N'0101110155012', N'10.0000', N'2000.000000', N'20000.00', N'2500.000000', N'25000.00', N'1', null, null, N'80')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170001', N'0101110171038', N'20.0000', N'1740.000000', N'34800.00', N'2740.000000', N'54800.00', N'2', null, null, N'81')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170001', N'0101110175043', N'30.0000', N'370.000000', N'11100.00', N'1370.000000', N'41100.00', N'3', null, null, N'82')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170002', N'0101110171038', N'10.0000', N'740.000000', N'7400.00', N'2740.000000', N'27400.00', N'1', null, null, N'83')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'RK20170002', N'0000000000002', N'10.0000', N'500.000000', N'5000.00', N'1000.000000', N'10000.00', N'2', null, null, N'84')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'CK20170001', N'0101110155012', N'11.0000', null, null, N'2500.000000', N'27500.00', N'1', null, null, N'85')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'CK20170001', N'0101110171038', N'22.0000', null, null, N'2740.000000', N'60280.00', N'2', null, null, N'86')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'CK20170001', N'0101110175043', N'33.0000', null, null, N'1370.000000', N'45210.00', N'3', null, null, N'87')
GO
GO
INSERT INTO [dbo].[Data_Log] ([DJ_Number], [CL_Code], [SL], [SJ_Price], [SJ_Money], [JH_Price], [JH_Money], [SX], [BZ], [Info], [ID]) VALUES (N'CK20170001', N'0000000000002', N'44.0000', null, null, N'1000.000000', N'44000.00', N'4', null, null, N'88')
GO
GO
SET IDENTITY_INSERT [dbo].[Data_Log] OFF
GO

-- ----------------------------
-- Indexes structure for table Data_Log
-- ----------------------------
CREATE INDEX [_WA_Sys_DJ_Number_22AA2996] ON [dbo].[Data_Log]
([DJ_Number] ASC) 
GO
CREATE INDEX [_WA_Sys_CL_Code_22AA2996] ON [dbo].[Data_Log]
([CL_Code] ASC) 
GO

-- ----------------------------
-- Primary Key structure for table Data_Log
-- ----------------------------
ALTER TABLE [dbo].[Data_Log] ADD PRIMARY KEY ([ID])
GO
mir521585 2017-09-29
  • 打赏
  • 举报
回复
呼叫呼叫,来个人帮我看看吧,实在搞不动了
RINK_1 2017-09-29
  • 打赏
  • 举报
回复

SELECT A.LB_CODE,
       SUM(CASE WHEN RN=1 THEN QCje ELSE 0 END) AS QCJE,
       SUM(入库金额) AS 入库金额,
       SUM(出库金额) AS 出库金额,
       COUNT(DISTINCT(CASE WHEN LB='入库' THEN DJ_NUMBER ELSE NULL END)) AS 入库单据张数,
       COUNT(DISTINCT(CASE WHEN LB='出库' THEN DJ_NUMBER ELSE NULL END)) AS 出库单据张数
FROM
(SELECT A.*,B.Cl_Code,B.QCje,C.DJ_Number,C.LB,C.出库金额,C.入库金额,
        ROW_NUMBER() OVER (PARTITION BY A.LB_CODE,B.CL_CODE ORDER BY GETDATE()) AS RN
FROM CLLB_DICT A
JOIN CL_DICT B ON A.LB_CODE=B.LB_CODE
JOIN (SELECT CL_CODE,
             A.DJ_NUMBER,
             MAX(LB) AS LB,
             SUM(CASE WHEN LB='入库' THEN B.JH_MONEY ELSE 0 END) AS 入库金额,
             SUM(CASE WHEN LB='出库' THEN B.JH_MONEY ELSE 0 END) AS 出库金额
       FROM DATA_BIAO A
       JOIN DATA_LOG B ON A.DJ_NUMBER=B.DJ_NUMBER
       WHERE (lb = '入库' OR lb = '出库')
             AND dj_date BETWEEN '2017-9-01 00:00:00'
             AND '2017-9-30 23:59:59'
       GROUP BY CL_CODE,A.DJ_NUMBER) AS C ON B.CL_CODE=C.CL_CODE) AS A
GROUP BY A.LB_CODE
听雨停了 2017-09-29
  • 打赏
  • 举报
回复
引用 17 楼 mir521585 的回复:
[quote=引用 16 楼 appetizing_fish1 的回复:] 看来楼主也是个完美主义者
呵呵,只是语句更简单一点,能实现我已经很满足了[/quote] 本来打算给你把代码优化下,这样看起来会舒服点,可能会的少点代码,无奈我要去坐火车了,没事的话可以自己倒腾倒腾里面的逻辑,你就知道为啥不能像你那样写了。 为啥你说的就差一些不对了,却要从写这么多sql,不甘心。从本质上你的逻辑这样写就有问题,所以就算你怎么想,按照你的逻辑都出不来,因为你的需求在sum的时候,必须是从两表或多表联合出来的结果集再去连另外一个表sum这样才不会出问题,直接sum会有问题。所以你sum出来的结果不是你想要的
听雨停了 2017-09-29
  • 打赏
  • 举报
回复
引用 15 楼 mir521585 的回复:
[quote=引用 14 楼 qq_37170555 的回复:] [quote=引用 13 楼 mir521585 的回复:] [quote=引用 12 楼 qq_37170555 的回复:] [quote=引用 11 楼 mir521585 的回复:] 嗯,万发感谢,我按照你的写法自己试一下,
你直接用我的在你的数据库上跑就能出来,不用修改啥[/quote] 嗯,因为还有一些别的条件,我要加上,另外,我对里面一些命令不太理解,我想拆开百度下,[/quote] 那你好好百度下,好好学习下,其实也没啥比较难懂的东西,都是些很基础的语法。不过这么有学习精神不错[/quote] 嗯,万分感谢,但还有更简单的语句吗?我用下面的语句,就只有单据张数不对了,就一个单据张数,写那么多语句,有点不甘心
SELECT
    a.lb_code,a.name,
    (select sum( QCje) from CL_Dict where LB_Code = a.LB_Code) AS 期初金额,
    SUM (CASE WHEN lb = '入库' THEN 1  ELSE 0 END) AS 入库单据张数,
    SUM (CASE WHEN lb = '入库' THEN c.jh_money  ELSE 0 END) AS 入库金额,
    SUM (CASE WHEN lb = '出库' THEN 1  ELSE 0 END) AS 出库单据张数,
    SUM (CASE WHEN lb = '出库' THEN c.jh_money  ELSE 0  eND) AS 出库金额,
    (select sum( QCje) from CL_Dict where LB_Code = a.LB_Code)+SUM (CASE WHEN lb = '入库' THEN c.jh_money  ELSE 0 END)-SUM (CASE WHEN lb = '出库' THEN c.jh_money  ELSE 0  eND) as 期未金额
FROM
    cllb_dict a
left JOIN cl_dict b ON a.lb_code = b.lb_code
LEFT JOIN data_log c ON c.cl_code = b.cl_code
LEFT JOIN data_biao d ON d.dj_number = c.dj_number
and (
    (lb = '入库' OR lb = '出库')
    AND dj_date BETWEEN '2017-9-01 00:00:00'
    AND '2017-9-30 23:59:59'
)
GROUP BY
    a.lb_code,a.name
ORDER BY
    a.lb_code
[/quote] 你上面自己的写法,期初金额也是不对的,还有单据张数也不对,逻辑绕来绕去代码怎么写都是这样,多不了多少,也少不了多少

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧