Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 xQuery  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Добрый день, коллеги.
Помогите, пожалуйста, составить запрос

SET LANGUAGE 'Russian';
DECLARE @xml XML = 
'
<Файл>
  <Документ ДатаДок="25.02.2016" ОтчетГод="2015">
     <СведДох Ставка="13">
      <ДохВыч>
        <СвСумДох Месяц="01" КодДоход="2000" СумДоход="345.63" />
        <СвСумДох Месяц="01" КодДоход="4800" СумДоход="371.00" />
        <СвСумДох Месяц="02" КодДоход="2000" СумДоход="237.78" />
        <СвСумДох Месяц="02" КодДоход="2012" СумДоход="172.72" />
      </ДохВыч>
    </СведДох>
    <СведДох Ставка="35">
      <ДохВыч>
        <СвСумДох Месяц="01" КодДоход="2610" СумДоход="116.77" />
        <СвСумДох Месяц="02" КодДоход="2610" СумДоход="87.89" />
        <СвСумДох Месяц="03" КодДоход="2610" СумДоход="77.84" />
      </ДохВыч>
    </СведДох>
   </Документ>
</Файл>
'
SELECT [color=red][/color]
	[ДатаДок]	= doc.col.value('@ДатаДок', 'date')
,	[ОтчетГод]	= doc.col.value('@ОтчетГод', 'int')
,	[Ставка] = doc.col.value('СведДох[1]/@Ставка','int')
,	[Месяц] = x.col.value('@Месяц', 'varchar(2)')
,	[КодДоход] = x.col.value('@КодДоход', 'int')
,	[СумДоход] = x.col.value('@СумДоход', 'decimal(19,2)')
FROM @xml.nodes('/Файл/Документ') AS doc(col)
CROSS APPLY doc.col.nodes( 'СведДох/ДохВыч/СвСумДох' ) AS x (col)


что бы получилась ставка 35, а не 13 как в запросе.

ДатаДок ОтчетГод Ставка Месяц КодДоход СумДоход
2016-02-25 2015 13 01 2000 345.63
2016-02-25 2015 13 01 4800 371.00
2016-02-25 2015 13 02 2000 237.78
2016-02-25 2015 13 02 2012 172.72
2016-02-25 2015 35 01 2610 116.77
2016-02-25 2015 35 02 2610 87.89
2016-02-25 2015 35 03 2610 77.84
28 фев 19, 10:14    [21821428]     Ответить | Цитировать Сообщить модератору
 Re: xQuery  [new]
invm
Member

Откуда: Москва
Сообщений: 9646
[Ставка] = x.col.value('(../..)[1]/@Ставка','int')
28 фев 19, 10:23    [21821438]     Ответить | Цитировать Сообщить модератору
 Re: xQuery  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
invm,

Спасибо большое!
28 фев 19, 10:34    [21821449]     Ответить | Цитировать Сообщить модератору
 Re: xQuery  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
+
DECLARE @xml xml= '<Файл ИдФайл="NO_NDFL0_0000_0000_0000000000000000000_00000000_0000d0fd-000c-0fbf-0000-f00ffd0000d0" ВерсПрог="КОНТУР-ОТЧЕТ ПФ 0.0" ВерсФорм="0.00">

  <СвРекв ОКТМО="00000000" ОтчетГод="0000" ПризнакФ="0">

    <СвЮЛ ИННЮЛ="0000000000" КПП="000000000" />

    <Подписант ПрПодп="0">
      <ФИО Фамилия="Александров" Имя="Александр" Отчество="Александрович" />

      <СвПред НаимДок="Доверенность №000 от 00.00.0000" НаимОрг="test" />

    </Подписант>

  </СвРекв>

<Документ КНД="0000000" НомСпр="0000" НомКорр="00" Признак="0" ДатаДок="00.00.0000" ОтчетГод="0000" КодНО="0000">

    <СвНА ОКТМО="00000000">

      <СвНАЮЛ НаимОрг="test" ИННЮЛ="000000000" КПП="000000000" />

    </СвНА>

    <ПолучДох ИННФЛ="000000000" Статус="0" ДатаРожд="00.00.0000" Гражд="000">

      <ФИО Фамилия="Платонов" Имя="Платон" Отчество="Платонович" />

      <УдЛичнФЛ КодУдЛичн="00" СерНомДок="00 00 00000" />

    </ПолучДох>

    <СведДох Ставка="13">

      <ДохВыч>

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />

      </ДохВыч>

      <СумИтНалПер СумДохОбщ="0000000.00" НалБаза="0000000.00" НалИсчисл="000000" НалУдерж="000000" НалПеречисл="000000" НалУдержЛиш="0" НалНеУдерж="0" АвансПлатФикс="0" />

    </СведДох>

    <СведДох Ставка="35">

      <ДохВыч>

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00" />

      </ДохВыч>

      <СумИтНалПер СумДохОбщ="0000.00" НалБаза="0000.00" НалИсчисл="0000" НалУдерж="0000" НалПеречисл="0000" НалУдержЛиш="0" НалНеУдерж="0" АвансПлатФикс="0" />

    </СведДох>

  </Документ>
  <Документ КНД="0000000" НомСпр="0000" НомКорр="00" Признак="0" ДатаДок="00.00.0000" ОтчетГод="0000" КодНО="0000">
    <СвНА ОКТМО="00000000">
      <СвНАЮЛ НаимОрг="test" ИННЮЛ="0000000000" КПП="000000000" />
    </СвНА>
    <ПолучДох ИННФЛ="000000000000" Статус="0" ДатаРожд="00.00.0000" Гражд="000">
      <ФИО Фамилия="Сергеев" Имя="Сергей" Отчество="Сергеивич" />
      <УдЛичнФЛ КодУдЛичн="00" СерНомДок="00 00 000000" />
    </ПолучДох>
    <СведДох Ставка="13">
      <ДохВыч>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
      </ДохВыч>
      <СумИтНалПер СумДохОбщ="00000.00" НалБаза="00000.00" НалИсчисл="0000" НалУдерж="0000" НалПеречисл="0000" НалУдержЛиш="0" НалНеУдерж="0" АвансПлатФикс="0" />
    </СведДох>
  </Документ>
  <Документ КНД="0000000" НомСпр="0000" НомКорр="00" Признак="0" ДатаДок="00.00.0000" ОтчетГод="0000" КодНО="0000">
    <СвНА ОКТМО="00000000">
      <СвНАЮЛ НаимОрг="test" ИННЮЛ="0000000000" КПП="000000000" />
    </СвНА>
    <ПолучДох ИННФЛ="000000000000" Статус="0" ДатаРожд="00.00.0000" Гражд="000">
      <ФИО Фамилия="Петров" Имя="Пётр" Отчество="Петрович" />
      <УдЛичнФЛ КодУдЛичн="00" СерНомДок="00 00 000000" />
    </ПолучДох>
    <СведДох Ставка="13">
      <ДохВыч>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00">
          <СвСумВыч КодВычет="000" СумВычет="000.00" />
        </СвСумДох>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00">
          <СвСумВыч КодВычет="000" СумВычет="000.00" />
        </СвСумДох>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00">
          <СвСумВыч КодВычет="000" СумВычет="000.00" />
        </СвСумДох>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00">
          <СвСумВыч КодВычет="000" СумВычет="000.00" />
        </СвСумДох>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00">
          <СвСумВыч КодВычет="000" СумВычет="0000.00" />
        </СвСумДох>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="000.00">
          <СвСумВыч КодВычет="000" СумВычет="000.00" />
        </СвСумДох>
      </ДохВыч>
      <СумИтНалПер СумДохОбщ="0000.00" НалБаза="000.00" НалИсчисл="00" НалУдерж="00" НалПеречисл="00" НалУдержЛиш="0" НалНеУдерж="0" АвансПлатФикс="0" />
    </СведДох>
  </Документ>
  <Документ КНД="0000000" НомСпр="0000" НомКорр="00" Признак="0" ДатаДок="00.00.0000" ОтчетГод="0000" КодНО="0000">
    <СвНА ОКТМО="00000000">
      <СвНАЮЛ НаимОрг="test" ИННЮЛ="0000000000" КПП="000000000" />
    </СвНА>
    <ПолучДох ИННФЛ="000000000000" Статус="0" ДатаРожд="00.00.0000" Гражд="000">
      <ФИО Фамилия="Сидоров" Имя="Сидр" Отчество="Сидорович" />
      <УдЛичнФЛ КодУдЛичн="00" СерНомДок="00 00 000000" />
    </ПолучДох>
    <СведДох Ставка="13">
      <ДохВыч>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="00000.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0000.00" />
      </ДохВыч>
      <СумИтНалПер СумДохОбщ="000000.00" НалБаза="000000.00" НалИсчисл="00000" НалУдерж="00000" НалПеречисл="00000" НалУдержЛиш="0" НалНеУдерж="0" АвансПлатФикс="0" />
    </СведДох>
  </Документ>
  <Документ КНД="0000000" НомСпр="0000" НомКорр="00" Признак="0" ДатаДок="00.00.0000" ОтчетГод="0000" КодНО="0000">
    <СвНА ОКТМО="00000000">
      <СвНАЮЛ НаимОрг="test" ИННЮЛ="000000000000" КПП="000000000" />
    </СвНА>
    <ПолучДох ИННФЛ="000000000000" Статус="0" ДатаРожд="00.00.0000" Гражд="000">
      <ФИО Фамилия="Иванов" Имя="Иван" Отчество="Иванович" />
      <УдЛичнФЛ КодУдЛичн="00" СерНомДок="00 00 000000" />
    </ПолучДох>
    <СведДох Ставка="13">
      <ДохВыч>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00">
          <СвСумВыч КодВычет="000" СумВычет="0.00" />
        </СвСумДох>
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
        <СвСумДох Месяц="00" КодДоход="0000" СумДоход="0.00" />
      </ДохВыч>
      <НалВычССИ>
        <ПредВычССИ КодВычет="000" СумВычет="0.00" />
        <ПредВычССИ КодВычет="000" СумВычет="0.00" />
        <ПредВычССИ КодВычет="000" СумВычет="0.00" />
      </НалВычССИ>
      <СумИтНалПер СумДохОбщ="0.00" НалБаза="0.00" НалИсчисл="0" НалУдерж="0" НалПеречисл="0" НалУдержЛиш="0" НалНеУдерж="0" АвансПлатФикс="0" />
    </СведДох>
  </Документ>
  </Файл>';

SELECT
	[Фамилия] = doc.col.value('ПолучДох[1]/ФИО[1]/@Фамилия', 'varchar(100)')
,	[Имя] = doc.col.value('ПолучДох[1]/ФИО[1]/@Имя', 'varchar(100)')
,	[Отчество] = doc.col.value('ПолучДох[1]/ФИО[1]/@Отчество', 'varchar(100)')
,	[Ставка] = СведДох.query('.').value('СведДох[1]/@Ставка','int')
FROM @xml.nodes('/Файл/Документ') AS doc(col)
CROSS APPLY @xml.nodes('/Файл/Документ/СведДох') col(СведДох)


Добрый день, как сделать так что бы ставка определилась корректно, а не как сейчас?

idФамилия Имя Отчество Ставка
1 Платонов Платон Платонович 13
2 Платонов Платон Платонович 35
3 Платонов Платон Платонович 13
4 Платонов Платон Платонович 13
5 Платонов Платон Платонович 13
6 Платонов Платон Платонович 13
7 Сергеев Сергей Сергеивич 13
8 Сергеев Сергей Сергеивич 35
9 Сергеев Сергей Сергеивич 13
10 Сергеев Сергей Сергеивич 13
11 Сергеев Сергей Сергеивич 13
12 Сергеев Сергей Сергеивич 13
13 Петров Пётр Петрович 13
14 Петров Пётр Петрович 35
15 Петров Пётр Петрович 13
16 Петров Пётр Петрович 13
17 Петров Пётр Петрович 13
18 Петров Пётр Петрович 13
19 Сидоров Сидр Сидорович 13
20 Сидоров Сидр Сидорович 35
21 Сидоров Сидр Сидорович 13
22 Сидоров Сидр Сидорович 13
23 Сидоров Сидр Сидорович 13
24 Сидоров Сидр Сидорович 13
25 Иванов Иван Иванович 13
26 Иванов Иван Иванович 35
27 Иванов Иван Иванович 13
28 Иванов Иван Иванович 13
29 Иванов Иван Иванович 13
30 Иванов Иван Иванович 13

Модератор: А следующую простыню без спойлера вообще на месте сотру.


Сообщение было отредактировано: 22 июл 19, 13:16
22 июл 19, 13:10    [21931680]     Ответить | Цитировать Сообщить модератору
 Re: xQuery  [new]
Nemoxur
Member

Откуда:
Сообщений: 179
Извините за простыню, не нашёл как сделать.

Проблема решилась, может кому пригодится.
SELECT	 col.[СведДох].value('ПолучДох[1]/ФИО[1]/@Фамилия', 'varchar(100)')
		,col.[СведДох].value('ПолучДох[1]/ФИО[1]/@Имя', 'varchar(100)')
		,col.[СведДох].value('ПолучДох[1]/ФИО[1]/@Отчество', 'varchar(100)')
		,col2.[СведДох].value('@Ставка', 'varchar(100)')
FROM @xml.nodes('.') AS doc(col)
CROSS APPLY doc.[col].nodes('Файл/Документ') col(СведДох)
CROSS APPLY col.[СведДох].nodes('СведДох') col2(СведДох)
22 июл 19, 15:53    [21931826]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить