Sql-server命令按进入声明表不正确 [英] Sql-server order by into declare table not correct

查看:93
本文介绍了Sql-server命令按进入声明表不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在sql server 2014上做了这个查询,事实是我必须正确排序查询的结果,查询的前两行输出(下面)是正确的,而从第三个开始是字段DescrizioneDis, CostoUnitario e Quantita,我插入第四行而不是第三行,我无法弄清楚我错在哪里?我输入了下面的查询,错误的视频结果,我想得到的结果和表结构!



图像不正确的结果

IMAGE正确的结果(我应该得到)



我想得到这个结果



SQL创建Capitolo表:

I made this query on sql server 2014, the fact is that I have to correctly order the result of the query, the first two lines of output of the query (below) are correct while from the third onwards the fields DescrizioneDis, CostoUnitario e Quantita, I get inserted in the fourth row instead of the third, I can not figure out where I'm wrong? I entered the query below, the wrong video result, the result I would like to get and the table structures!

IMAGE OF Incorrect Result
IMAGE OF Correct result(that i should get)

I WOULD LIKE to get this result

SQL Create Table of Capitolo:

CREATE TABLE [dbo].[Capitolo](
    [IdCapitolo] [int] IDENTITY(1,1) NOT NULL,
    [IdPreventivo] [int] NULL,
    [NumeroCapitolo] [int] NULL,
    [Descrizione] [varchar](5000) NOT NULL,
    [Ricarico] [money] NULL,
    [Modificaincorso] [varchar](100) NULL,
    [Tipologia] [varchar](20) NULL,
    [PrezzoRiservato] [money] NULL,
PRIMARY KEY CLUSTERED 
(
    [IdCapitolo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]





SQL创建SottoCapitolo表:



SQL Create Table of SottoCapitolo:

CREATE TABLE [dbo].[SottoCapitolo](
    [IdSottoCapitolo] [int] IDENTITY(1,1) NOT NULL,
    [IdCapitolo] [int] NULL,
    [Tipo] [varchar](500) NULL,
    [Codice] [varchar](500) NULL,
    [CodiceDistinta] [int] NULL,
    [Descrizione] [varchar](5000) NULL,
    [DescrizioneEstesa] [varchar](5000) NULL,
    [UnitaMisura] [varchar](10) NULL,
    [SottoCapitolo1] [varchar](100) NULL,
    [SottoCapitolo2] [varchar](100) NULL,
    [SottoCapitolo3] [varchar](100) NULL,
    [Note] [varchar](1000) NULL,
    [RicaricoManodopera] [float] NULL,
    [Quantita] [int] NULL,
    [CostoUnitario] [money] NULL,
    [Images] [varbinary](max) NULL,
    [PrezzoListino] [money] NULL,
PRIMARY KEY CLUSTERED 
(
    [IdSottoCapitolo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Tipo]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Codice]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [CodiceDistinta]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Descrizione]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [DescrizioneEstesa]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [UnitaMisura]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [SottoCapitolo1]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [SottoCapitolo2]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [SottoCapitolo3]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Note]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT ((0)) FOR [RicaricoManodopera]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Quantita]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [CostoUnitario]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT (NULL) FOR [Images]
GO

ALTER TABLE [dbo].[SottoCapitolo] ADD  DEFAULT ((0)) FOR [PrezzoListino]
GO

ALTER TABLE [dbo].[SottoCapitolo]  WITH CHECK ADD FOREIGN KEY([IdCapitolo])
REFERENCES [dbo].[Capitolo] ([IdCapitolo])
GO





我的尝试:



这是我的查询:



What I have tried:

This is my Query now:

DECLARE @T AS TABLE (
  Descrizione varchar(5000),
  NumeroCapitolo varchar(100),
  SottoCapitolo1 varchar(5000),
  SottoCapitolo2 varchar(5000),
  SottoCapitolo3 varchar(5000),
  Totale money,
  DescrizioneEstesa varchar(5000),
  Images image,
  CostoUnitario money,
  Quantita money,
  DescrizioneDis varchar(5000),
  Tipologia varchar(300),
  PrezzoRiservato money,
  UM varchar(50)
);
INSERT INTO @T
  SELECT
    Capitolo.Descrizione,
    Capitolo.NumeroCapitolo,
    SottoCapitolo.SottoCapitolo1,
    SottoCapitolo.SottoCapitolo2,
    SottoCapitolo.SottoCapitolo3,
    (ROUND(((((ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2)) / 100) * PercentualeMargine) + (ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2))), 2)) * SottoCapitolo.Quantita AS Totale,
    SottoCapitolo.DescrizioneEstesa,
    SottoCapitolo.Images,
    ROUND(((((ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2)) / 100) * PercentualeMargine) + (ROUND((((((((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario) / 100) * Capitolo.Ricarico) + (((SottoCapitolo.CostoUnitario / 100) * PercentualeSpeseGenerali) + SottoCapitolo.CostoUnitario)) * 1), 2))), 2) AS CostoUnitario,
    SottoCapitolo.Quantita,
    CASE
      WHEN Tipologia = 'Prezzo' THEN SottoCapitolo.Descrizione
      ELSE '' + SottoCapitolo.Codice + '     ' + SottoCapitolo.Descrizione
    END AS DescrizioneDis,
    Capitolo.Tipologia,
    Capitolo.PrezzoRiservato,
    SottoCapitolo.UnitaMisura AS UM
  FROM Capitolo
  INNER JOIN SottoCapitolo
    ON SottoCapitolo.IdCapitolo = Capitolo.IdCapitolo
  INNER JOIN Preventivo
    ON Preventivo.IdPreventivo = Capitolo.IdPreventivo
  WHERE Preventivo.IdPreventivo = '196';
SELECT
  CASE
    WHEN ROW_NUMBER()
      OVER (PARTITION BY a.Descrizione ORDER BY a.Descrizione) = 1 THEN a.Descrizione
    ELSE ''
  END AS Descrizione,
  a.NumeroCapitolo,
  a.SottoCapitolo1,
  a.SottoCapitolo2,
  a.SottoCapitolo3,
  a.DescrizioneDis,
  a.CostoUnitario,
  a.Quantita,
  a.Totale AS TotaleCap,
  a.DescrizioneEstesa,
  a.Images,
  a.Tipologia,
  a.PrezzoRiservato,
  a.UM
FROM (SELECT
  1 AS d,
  ROW_NUMBER() OVER (PARTITION BY Descrizione ORDER BY Descrizione) AS r,
  Descrizione,
  NumeroCapitolo,
  SottoCapitolo1,
  SottoCapitolo2,
  SottoCapitolo3,
  Totale,
  DescrizioneDis,
  Images,
  CostoUnitario,
  Quantita,
  DescrizioneEstesa,
  Tipologia,
  PrezzoRiservato,
  UM
FROM @T
UNION ALL
SELECT
  2,
  0,
  Descrizione,
  NumeroCapitolo,
  '',
  '',
  '',
  SUM(Totale),
  '',
  '',
  '',
  '',
  '',
  Tipologia,
  PrezzoRiservato,
  ''
FROM @T
GROUP BY NumeroCapitolo,
         Descrizione,
         PrezzoRiservato,
         Tipologia) AS a
ORDER BY NumeroCapitolo

推荐答案

你好:

我害怕我不明白这个问题,但我想如果你更换

Hello:
I´m afraid that i dont understand exactly the problem, but i think that if you replace
Order by NumeroCapitolo



by


by

Order by NunmeroCapitolo, 
CASE  ( (DescrizioneDis IS NULL)  OR DescrizioneDis='') AND CostoUnitario=0 AND Quantita=0 THEN 1 ELSE 0 END 



然后在同一个NumeroCapitulo中你可以看到按以下顺序排序的行:



- 第一个(值0)全部不符合下一段的原始物

- 最后(值1)所有DescrizioneDis,CostoUnitario和Quantita都是空的原始物





打扰一下,如果我不明白你的意思。


then in the same NumeroCapitulo you can see the rows ordered in the following order:

- first (value 0) all the raws that doesn´t fit in the next paragraph
- last (value 1) all the raws that the DescrizioneDis, CostoUnitario and Quantita are EMPTY


Excuse me if i haven´t understood what do you mean.


这篇关于Sql-server命令按进入声明表不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆